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;
}
}
}
}
}