您的位置:首页 > 其它

哈理工OJ- 1161 - Leyni【树状数组】

2018-02-21 19:47 295 查看
HRBUST - 1161 - Leyni【树状数组】

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

#include<bits/stdc++.h>
using namespace std;

int T;
int n,q,t;
char s[20];
int c[100005];
int d[100005];

int Lowbit(int x)
{
return x&(-x);
}
void update(int pos,int val)
{
while(pos<=n)
{
c[pos]+=val;
pos+=Lowbit(pos);
}
}
int query(int pos)
{
int res=0;
while(pos>0)
{
res+=c[pos];
pos-=Lowbit(pos);
}
return res;
}

int main()
{

scanf("%d",&T);
for(int k=1; k<=T; k++)
{

scanf("%d%d%d",&n,&q,&t);
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
int attack=0;
printf("Case %d:\n",k);
while(q--)
{
scanf("%s",s);
if(s[0]=='A')
{
attack++;
int x;
scanf("%d",&x);
if(d[x]==0)//第一次被攻击
{
d[x]=attack;
}
else
{
if(d[x]+t<=attack)
{
d[x]=attack;
}
else
update(x,1);

}
}
int l,r;

if(s[0]=='Q')
{
scanf("%d%d",&l,&r);

printf("%d\n",query(r)-query(l-1));
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: