Leyni | ||||||
|
||||||
Description | ||||||
Leyni被人掳走,身在水深火热之中... 小奈叶为了拯救Leyni,独自一人前往森林深处从静竹手中夺回昏迷中的Leyni。 历经千辛万苦,小奈叶救出了Leyni,但是静竹为此极为恼怒,决定对他们发起最强烈的进攻。 不过小奈叶有一个叫做能量保护圈的道具,可以保护他们。 这个保护圈由n个小的小护盾围成一圈,从1到n编号。当某一块小护盾受到攻击的时候,小护盾就会抵消掉这次攻击,也就是说对这一块小护盾的攻击是无效攻 现在小奈叶专心战斗,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 <iostream> #include <stdio.h> #include <string.h> using namespace std; const int MAXN=100001; int c[MAXN],p[MAXN]; int xiji; int n,q,t,aa,b; int lowbit(int x) { return x&(-x); } void add(int x,int val) { int i=x; while(i<=n) { c[i]+=val; i+=lowbit(i); } } int get_sum(int x) { int s=0; while(x>0) { s+=c[x]; x-=lowbit(x); } return s; } int main() { int k; int s; char str[20]; s=0; scanf("%d",&k); for(int i=0;i<k;i++) { s++; memset(c,0,sizeof(c)); scanf("%d%d%d",&n,&q,&t); for(int i=1; i<=n; i++) p[i]=-t; xiji=0; printf("Case %d:\n",s); for(int i=1; i<=q; i++) { scanf("%s",&str); if(str[0]==‘A‘) { xiji++; scanf("%d",&aa); if(p[aa]+t<=xiji) p[aa]=xiji; else { add(aa,1); } } else if(str[0]==‘Q‘) { scanf("%d%d",&aa,&b); if(aa>b) swap(aa,b); printf("%d\n",get_sum(b)-get_sum(aa-1)); } } } return 0; } 注:没有线段树快哦~~~~ get_sum()函数求起点到该点的和 ****************************************************** http://blog.csdn.net/shahdza/article/details/6314818 ******************************************************
HRBUST 1161 树状数组区间更新求和,布布扣,bubuko.com
时间: 2024-10-24 11:35:12