hdu 4031 Attack(树状数组)

刚开始看错题意,以为防御全部都要缓冲,wa了几次,重新看题才知道是部分缓冲。

ans = 总的攻击次数 - 防御次数

View Code
 1 /*
 2 Author:Zhaofa Fang
 3 Lang:C++
 4 */
 5 #include <cstdio>
 6 #include <cstdlib>
 7 #include <sstream>
 8 #include <iostream>
 9 #include <cmath>
10 #include <cstring>
11 #include <algorithm>
12 #include <string>
13 #include <utility>
14 #include <vector>
15 #include <queue>
16 #include <stack>
17 #include <map>
18 #include <set>
19 
20 using namespace std;
21 
22 typedef long long ll;
23 #define DEBUG(x) cout<< #x << ':' << x << endl
24 #define PII pair<int,int>
25 #define PB push_back
26 #define MP make_pair
27 #define FI first
28 #define SE second
29 #define lowbit(x) (x & (x ^ (x-1)))
30 #define INF (1<<30)
31 
32 struct attack
33 {
34     int si,ti;
35 }a[20005];
36 int C[20005];
37 void add(int x,int pos,int n)
38  {
39      while(pos<=n)
40      {
41          C[pos] += x;
42          pos += lowbit(pos);
43      }
44  }
45  int SUM(int pos)
46  {
47      int res = 0;
48      while(pos > 0)
49      {
50          res += C[pos];
51          pos -= lowbit(pos);
52      }
53      return res;
54  }
55 int main()
56 {
57     #ifndef ONLINE_JUDGE
58     freopen("out","r",stdin);
59     #endif
60     int T;
61     cin>>T;
62     int cas = 0;
63     while(T--)
64     {
65         int n,q,t;
66         scanf("%d%d%d",&n,&q,&t);
67         printf("Case %d:\n",++cas);
68         int cnt = 0;
69         char op[10];
70         int p;
71         memset(C,0,sizeof(C));
72         for(int i=1;i<=q;i++)
73         {
74             scanf("%s",op);
75             if(op[0] == 'A')
76             {
77                 scanf("%d%d",&a[cnt].si,&a[cnt].ti);
78                 add(1,a[cnt].si,n);
79                 add(-1,a[cnt].ti+1,n);
80                 cnt++;
81             }
82             else
83             {
84                 scanf("%d",&p);
85                 int tmp = 0;
86                 for(int j=0;j<cnt;j++)
87                 {
88                     if(a[j].si<=p && p<=a[j].ti)
89                     {
90                         tmp++;
91                         j += t-1;
92                     }
93                 }
94                 printf("%d\n",SUM(p)-tmp);
95             }
96         }
97     }
98     return 0;
99 }

转载于:https://www.cnblogs.com/fzf123/archive/2012/10/23/2736212.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值