#include<cstdio> //类是差分的思想区间更新
#include<cstring> //思路:用每个点总的攻击次数-无效次数
#include<algorithm>
using namespace std;
int n,q,t;
int s[20005];
int l[20005],r[20005],last[20005],useless[20005];
int lowbit(int x){
return x&(-x);
}
void insert(int i,int num)
{
while(i<=n)
{
s[i]+=num;
i+=lowbit(i);
}
}
int sum(int x)
{
int ans=0;
while(x)
{
ans+=s[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
int a,b,c,cnt=1;
char s1[20];
scanf("%d",&c);
while(c--)
{
printf("Case %d:\n",cnt++);
int add=0;
memset(l,0,sizeof(l)); //记录每次攻击的左坐标
memset(r,0,sizeof(r)); //记录每次攻击的右坐标
memset(s,0,sizeof(s)); //树状数组
memset(last,0,sizeof(last)); //记录上次攻击的侯能再次攻击无效的的时间
memset(useless,0,sizeof(useless));//记录每个点的无效攻击次数
scanf("%d %d %d",&n,&q,&t);
for(int i=1;i<=q;i++)
{
scanf("%s",s1);
if(s1[0]=='A')
{
scanf("%d %d",&a,&b);
insert(a,1);
insert(b+1,-1);
l[add]=a,r[add]=b;
add++;
}
else if(s1[0]=='Q')
{
scanf("%d",&a);
for(int j=last[a];j<add;j++)
{
if(l[j]<=a&&a<=r[j])
{
useless[a]++; //记录无用的攻击次数
last[a]=j+t; //记录的试有防御的上次的位置
j=j+t-1; //移动位置到回复后的位置
}//这个坑点试因为这里不加t而加t-1 因为for循环里边有个j++
}
printf("%d\n",sum(a)-useless[a]); //所有次数减去无用次数
}
}
}
return 0;
}
HDU4031(树状数组)详解
猜你喜欢
转载自blog.csdn.net/qq_37699336/article/details/78585432
今日推荐
周排行