标签:
2 3 7 2 Attack 1 2 Query 2 Attack 2 3 Query 2 Attack 1 3 Query 1 Query 3 9 7 3 Attack 5 5 Attack 4 6 Attack 3 7 Attack 2 8 Attack 1 9 Query 5 Query 3
Case 1: 0 1 0 1 Case 2: 3 2
美国建立了一套新的防御系统。每个点都可以进行自动防御,但是防御过后该点的防御
需要一段冷却时间,也就是说在此期间不能再进行防御。现在又两种操作:1.恐怖分子
每次会对一段范围进行攻击。2.指挥官询问某点被攻击的次数
BIT做法:我们知道由于询问不费时间,所以我们考虑设计一个数组tt[i]记录i点可以
进行防御的时间,当时间t>=tt[i]的时候表示攻击可以被防御。那么被攻击的次数=
总的攻击次数-防御次数。
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<string> #include<iostream> #include<queue> #include<cmath> #include<map> #include<stack> #include<bitset> using namespace std; #define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i ) #define REP( i , n ) for ( int i = 0 ; i < n ; ++ i ) #define CLEAR( a , x ) memset ( a , x , sizeof a ) typedef long long LL; const int maxn = 20005; int N,Q,T,t; int c[maxn],d[maxn],tt[maxn];//tt[i]记录某点可以进行防御的时间,大于这个时间都可以进行防御; struct node//d[i]记录某点成功防御次数 { int l,r; }e[maxn]; int lowbit(int x) { return x&(-x); } void update(int x,int w) { while(x<maxn) { c[x]+=w; x+=lowbit(x); } } int query(int x) { int s=0; while(x>0) { s+=c[x]; x-=lowbit(x); } return s; } int main() { int cas=1; int pos,l,r; char str[5]; scanf("%d",&t); while(t--) { int cnt=0; CLEAR(c,0); CLEAR(tt,0); CLEAR(d,0); scanf("%d%d%d",&N,&Q,&T); printf("Case %d:\n",cas++); while(Q--) { scanf("%s",str); if(str[0]=='A') { scanf("%d%d",&l,&r); e[cnt].l=l; e[cnt++].r=r; update(l,1); update(r+1,-1); } else { scanf("%d",&pos); for(int i=tt[pos];i<cnt;i++)//记录某点可以进行防御的时间,大于等于该时间的攻击都可以自动进行防御 { if(pos>=e[i].l&&pos<=e[i].r) { d[pos]++; tt[pos]=i+T; i+=T-1; } } printf("%d\n",query(pos)-d[pos]); } } } return 0; }
标签:
原文地址:http://blog.csdn.net/u013582254/article/details/42226905