zoukankan      html  css  js  c++  java
  • 【树状数组区间修改单点查询】HDU 4031 Attack

    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 }
    View Code
  • 相关阅读:
    机电传动控制第五周学习笔记
    机电传动控制第四周学习笔记和仿真作业
    第三周学习笔记
    《机电传动控制》第二周作业
    学习笔记第一周
    第十周作业
    第八周仿真作业
    第六周学习笔记
    第五周作业
    机电传动控制第四周作业
  • 原文地址:https://www.cnblogs.com/itcsl/p/7436539.html
Copyright © 2011-2022 走看看