zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    索引器
    异常
    C#各版本
    构造函数
    值类型和引用类型
    面向对象聊天机器人
    linux 系统快捷键
    linux 系统常用设置
    linux 系统介绍
    linux 命令学习.txt
  • 原文地址:https://www.cnblogs.com/fzf123/p/2736212.html
Copyright © 2011-2022 走看看