Leyni | ||||||
|
||||||
Description | ||||||
Leyni被人掳走,身在水深火热之中...
现在小奈叶专心战斗,Leyni昏迷,他们无法得知小护盾遭受的有效攻击次数,他们需要你的帮助。
只要能帮到他们,Leyni就会赠送出一份小奈叶写真集。 |
||||||
Input | ||||||
第一行是一个整数T,表示有多少组测试数据。 |
||||||
Output | ||||||
每一组测试数据,先输出一行"Case i:",i表示第i组测试数据,从1开始计数。 |
||||||
Sample Input | ||||||
1 |
||||||
Sample Output | ||||||
Case 1: |
题目并不难,开始的时候想的复杂些,不过这里有个坑:查询操作不占CD时间(这里玩游戏的应该明白啥叫CD吧~),也就是说,查询操作不占回合数。。。。
多组操作,多组求和,线段树无疑~。不过好像理工的sharecodes里边都是用树状数组过的。这里表示没有喜欢线段树的小伙伴吗?
不多啰嗦了这里详解思路:
我们这里用一个一维数组表示护盾冷却好的时间。初始化为0.
每一次Attack的时候,回合数要+1;
如果回合数<护盾冷却好的时间,说明这里冷却还没缓好,说明算是一次有效攻击,所以要在对应点上update。
否则,回合数>护盾冷却好的时间的时候,说明这里冷却已经缓好了,不算是一次有效攻击,这个时候更新冷却时间。具体操作如下:
for(int i=1;i<=q;i++) { char op[50]; scanf("%s",op); if(op[0]=='Q')//查询操作。 { int x,y; scanf("%d%d",&x,&y); printf("%d\n",Query(x,y,1,n,1)); } if(op[0]=='A')//攻击操作。 { huihe++; int x; scanf("%d",&x); if(huihe<hudun[x])//如果回合数小于冷却时间,有效攻击一次。 { update(x,1,1,n,1); } else { hudun[x]=huihe+t;//相反的,不算做有效攻击,并且更新冷却时间。 } } }然后上完整的AC代码:
#include<stdio.h> #include<string.h> using namespace std; #define lson l,m,rt*2 #define rson m+1,r,rt*2+1 int hudun[100050]; int tree[100050*8]; void pushup(int rt) { tree[rt]=tree[rt<<1]+tree[rt<<1|1]; } int Query(int L,int R,int l,int r,int rt)//区间求和 { if(L<=l&&r<=R) { return tree[rt]; } else { int m=(l+r)>>1; int ans=0; if(L<=m) { ans+=Query(L,R,lson); } if(m<R) { ans+=Query(L,R,rson); } return ans; } } void update(int p,int c,int l,int r,int rt)//p位子,c数据.//+c次有效攻击,这里c==1 { //printf("%d %d %d %d %d\n",p,c,l,r,rt); if(l==r) { tree[rt]+=c; } else { int m=(l+r)>>1; if(p<=m) update(p,c,lson); else update(p,c,rson); pushup(rt); //printf("sum[%d]:%d\n",rt,tree[rt]); } } void build( int l ,int r , int rt )//建树 { if( l == r ) { tree[rt]=0;//初始化有效攻击次数为0 return ; } else { int m = (l+r)>>1 ; build(lson) ; build(rson) ; pushup(rt) ; } } int main() { int t; int kase=0; scanf("%d",&t); while(t--) { int n,q,t; memset(tree,0,sizeof(tree)); memset(hudun,0,sizeof(hudun));//这里是必要的 scanf("%d%d%d",&n,&q,&t); build(1,n,1); int huihe=0; printf("Case %d:\n",++kase); for(int i=1;i<=q;i++) { char op[50]; scanf("%s",op); if(op[0]=='Q') { int x,y; scanf("%d%d",&x,&y); printf("%d\n",Query(x,y,1,n,1)); } if(op[0]=='A') { huihe++; int x; scanf("%d",&x); if(huihe<hudun[x]) { update(x,1,1,n,1); } else { hudun[x]=huihe+t; } } } } }