码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-08-26 22:52:15      阅读:299      评论:0      收藏:0      [点我收藏+]

标签:查询   color   操作   code   时间   open   std   img   lap   

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

 

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

标签:查询   color   操作   code   时间   open   std   img   lap   

原文地址:http://www.cnblogs.com/itcsl/p/7436539.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!