您的位置:首页 > 其它

【树状数组区间修改单点查询】HDU 4031 Attack

2017-08-26 22:15 330 查看
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:\n",++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\n",ans);
92             }
93         }
94     }
95     return 0;
96 }


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: