http://acm.hdu.edu.cn/showproblem.php?pid=4031
【题意】
- 有一个长为n的长城,进行q次操作,d为防护罩的冷却时间,Attack表示区间a-b的墙将在1秒后受到攻击,
- 询问表示计算第a块墙受到攻击的次数,被防护罩抵消的不算
【思路】
- 总的攻击次数-防护罩抵消的次数
- 总的攻击次数可以树状数组维护
- 防护罩抵消的模拟
【AC】
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int n,q,t; 5 const int maxn=2e4+2; 6 int a[maxn]; 7 int l[maxn],r[maxn]; 8 int cur[maxn]; 9 int sum[maxn]; 10 int tree[maxn]; 11 int cnt; 12 13 void init() 14 { 15 memset(tree,0,sizeof(tree)); 16 cnt=0; 17 memset(l,0,sizeof(l)); 18 memset(r,0,sizeof(r)); 19 memset(cur,0,sizeof(cur)); 20 memset(sum,0,sizeof(sum)); 21 } 22 int lowbit(int x) 23 { 24 return x&-x; 25 } 26 void add(int k,int x) 27 { 28 while(k<=n) 29 { 30 tree[k]+=x; 31 k+=lowbit(k); 32 } 33 } 34 int query(int k) 35 { 36 int ans=0; 37 while(k) 38 { 39 ans+=tree[k]; 40 k-=lowbit(k); 41 } 42 return ans; 43 } 44 int solve(int x) 45 { 46 int i=cur[x]; 47 while(i<cnt) 48 { 49 if(x>=l[i]&&x<=r[i]) 50 { 51 sum[x]++; 52 i+=t; 53 cur[x]=i; 54 } 55 else 56 { 57 i++; 58 } 59 } 60 return sum[x]; 61 } 62 int main() 63 { 64 int T; 65 scanf("%d",&T); 66 int cas=0; 67 while(T--) 68 { 69 init(); 70 scanf("%d%d%d",&n,&q,&t); 71 printf("Case %d: ",++cas); 72 char op[10]; 73 while(q--) 74 { 75 scanf("%s",op); 76 if(op[0]=='A') 77 { 78 int x,y; 79 scanf("%d%d",&x,&y); 80 l[cnt]=x;r[cnt++]=y; 81 add(x,1); 82 add(y+1,-1); 83 } 84 else 85 { 86 int x; 87 scanf("%d",&x); 88 int ans=query(x); 89 int delta=solve(x); 90 ans-=delta; 91 printf("%d ",ans); 92 } 93 } 94 } 95 return 0; 96 }