hrbustoj 1161:Leyni(树状数组练习)

Leyni
Time Limit: 3000 MS Memory Limit: 65536 K
Total Submit: 260(59
users) Total Accepted: 80(55 users) Rating: Special Judge:
No
Description
Leyni被人掳走,身在水深火热之中...
小奈叶为了拯救Leyni,独自一人前往森林深处从静竹手中夺回昏迷中的Leyni。
历经千辛万苦,小奈叶救出了Leyni,但是静竹为此极为恼怒,决定对他们发起最强烈的进攻。
不过小奈叶有一个叫做能量保护圈的道具,可以保护他们。
这个保护圈由n个小的小护盾围成一圈,从1到n编号。当某一块小护盾受到攻击的时候,小护盾就会抵消掉这次攻击,也就是说对这一块小护盾的攻击是无效攻击,从而保护圈里的人,不过小护盾在遭到一次攻击后,需要t秒进行冷却,在冷却期间受到的攻击都是有效攻击,此时他们就会遭到攻击,
即假设1秒时受到攻击并成功防御,到1+t秒时冷却才结束并能进行防御,在2到t受到的都是有效攻击。

现在小奈叶专心战斗,Leyni昏迷,他们无法得知小护盾遭受的有效攻击次数,他们需要你的帮助。
只要能帮到他们,Leyni就会赠送出一份小奈叶写真集。

Input
第一行是一个整数T,表示有多少组测试数据。
第一行是三个整数,n,q,t,n表示保护圈的长度,q表示攻击的询问的总次数,t表示能量盾的冷却时间。
接下来的q行,每行表示受到的攻击或者她询问某范围内的能量盾被攻击的次数。
攻击:
Attack
a
表示编号为a的小护盾受到一次攻击, 保证 1 <= a <= n
询问:
Query a
b
表示询问编号从a到b的小护盾(包括a和b)总共受到了多少次有效攻击。保证
1<=a,b<=n
第k次攻击发生在第k秒,询问不花费时间。
1 <= n,q <=100000
1 <= t
<= 50。

Output
每一组测试数据,先输出一行"Case
i:",i表示第i组测试数据,从1开始计数。
之后对于每一个询问,输出该范围内的小护盾受到的有效攻击次数,一个询问一行。

Sample Input
1
4 7 3
Attack 1
Attack 1
Attack 1
Attack
2
Attack 2
Query 1 4
Query 1 1

Sample Output
Case 1:
3
2

Author
黄李龙


  树状数组练习

  一开始想着用cd[]数组记录攻击数,每一次攻击都cd[a]--
一次。后来发现这样每一次都要把整个数组循环一遍,会超时。就看了别人的代码,发现不用这么麻烦。不断计数攻击次数,如果防御时受到攻击(cd[a]+t<=cnt),就把这块盾牌的cd时间=当前攻击次数(cd[a]=cnt)。

  代码


 1 #include <stdio.h>
2 #include <iostream>
3 using namespace std;
4 int lowbit(int x)
5 {
6 return x & -x;
7 }
8 int sum(int a[],int x) //求出第x个元素之前的和
9 {
10 int ans = 0;
11 while(x>0){
12 ans+=a[x];
13 x -= lowbit(x); //向左上爬
14 }
15 return ans;
16 }
17 void add(int a[],int x,int d,int n) //将编号为x的数加d
18 {
19 while(x<=n){
20 a[x]+=d;
21 x+=lowbit(x);
22 }
23 }
24 int main()
25 {
26 int i,j,T,n,q,t,Case;
27 scanf("%d",&T);
28 for(Case=1;Case<=T;Case++){
29 scanf("%d%d%d",&n,&q,&t);
30 printf("Case %d:\n",Case);
31 char str[100];
32 int c[100010]={0}; //有效攻击次数
33 int cd[100010]={0}; //冷却时间
34 for(i=1;i<=n;i++) //初始化cd[]数组
35 cd[i]=-t;
36 int cnt = 0;
37 for(j=1;j<=q;j++){
38 scanf("%s",str);
39 if(str[0]==‘A‘){ //攻击
40 cnt++;
41 int a;
42 scanf("%d",&a);
43 if(cd[a]+t<=cnt){ //防御中
44 cd[a] = cnt;
45 }
46 else { //冷却中
47 add(c,a,1,n);
48 }
49 }
50 else if(str[0]==‘Q‘){ //询问
51 int a,b;
52 if(a>b){
53 int tt = a;
54 a=b;b=tt;
55 }
56 scanf("%d%d",&a,&b);
57 printf("%d\n",sum(c,b)-sum(c,a-1));
58 }
59 }
60 }
61 return 0;
62 }

Freecode : www.cnblogs.com/yym2013

hrbustoj 1161:Leyni(树状数组练习),码迷,mamicode.com

时间: 2024-11-05 22:06:36

hrbustoj 1161:Leyni(树状数组练习)的相关文章

HRBUST 1161 树状数组区间更新求和

Leyni Time Limit: 3000 MS Memory Limit: 65536 K Total Submit: 267(64 users) Total Accepted: 82(57 users) Rating: Special Judge: No Description Leyni被人掳走,身在水深火热之中... 小奈叶为了拯救Leyni,独自一人前往森林深处从静竹手中夺回昏迷中的Leyni. 历经千辛万苦,小奈叶救出了Leyni,但是静竹为此极为恼怒,决定对他们发起最强烈的进攻.

【题解】Leyni,罗莉和队列(树状数组)

[题解]Leyni,罗莉和队列(树状数组) HRBUST - 1356 将整个序列reverse一下,现在就变成了从高到低的排队.题目就变成了,定位一个妹子,问这个妹子前面的比这个妹子小的妹子中,下标最小的数是哪个. 所以以年龄为下标,以(原数组)下标为值建立一颗值域线段树,由于我们只要找到在原数组下标最小的哪一个,所以相当于动态维护前缀\(\min\) ,由于我们只要查询比当前定位妹子小的一段前缀,所以拿树状数组代替就是了. 由于这群妹子是神仙(年龄可达1e9),所以要离散化一下. 复杂度\(

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

(POJ 3067) Japan (慢慢熟悉的树状数组)

Japan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29295   Accepted: 7902 Description Japan plans to welcome the ACM ICPC World Finals and a lot of roads must be built for the venue. Japan is tall island with N cities on the East coas

【二维树状数组】See you~

https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/F [题意] 给定一个矩阵,每个格子的初始值为1.现在可以对矩阵有四种操作: A x y n1 :给格点(x,y)的值加n1 D x y n1: 给格点(x,y)的值减n1,如果现在格点的值不够n1,把格点置0 M x1 y1 x2 y2:(x1,y1)移动给(x2,y2)n1个 S x1 y1 x2 y2 查询子矩阵的和 [思路] 当然是二维树状数组 但是一定要注意:lowbi

Vijos P1066 弱弱的战壕【多解,线段树,暴力,树状数组】

弱弱的战壕 描述 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了-_-b. mx在他的基地附近建立了n个战壕,每个战壕都是一个独立的作战单位,射程可以达到无限(“mx不赢定了?!?”永恒[email protected][email protected]). 但是,战壕有一个弱点,就是只能攻击它的左下方,说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT).这样,永恒就可以从别的地方进攻摧毁战壕,从而消灭mx的部队. 战壕都有一个保护范围,同它的攻击

CF 313 DIV2 B 树状数组

http://codeforces.com/contest/313/problem/B 题目大意 给一个区间,问你这个区间里面有几个连续相同的字符. 思路: 表示个人用树状数组来写的...了解了树状数组的本质就行了. 当然用sum[r]-sum[l]也是可以的

Hdu5032 极角排序+树状数组

题目链接 思路:参考了题解.对询问进行极角排序,然后用树状数组维护一下前缀和即可. /* ID: onlyazh1 LANG: C++ TASK: test */ #include<bits/stdc++.h> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef long long ll; const int maxn=1010; const int maxm=10

Curious Robin Hood(树状数组+线段树)

1112 - Curious Robin Hood    PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 64 MB Robin Hood likes to loot rich people since he helps the poor people with this money. Instead of keeping all the money together he does another tri