zoukankan      html  css  js  c++  java
  • 【HDU】1540 Tunnel Warfare

      1 #include<cstdio>
      2 #include<stack>
      3 #define MAXN 50010
      4 #define MAX(a,b) ((a)>(b)?(a):(b))
      5 using namespace std;
      6 stack<int>st;
      7 struct node
      8 {
      9     int left,right;
     10 };
     11 node tree[MAXN<<2];
     12 void Build(int L,int R,int rt)
     13 {
     14     tree[rt].left=tree[rt].right=R-L+1;
     15     if(L!=R)
     16     {
     17         int mid=(L+R)>>1;
     18         Build(L,mid,rt<<1);
     19         Build(mid+1,R,rt<<1|1);
     20     }
     21 }
     22 inline void PushUp(int mid,int L,int R,int rt)
     23 {
     24     tree[rt].left=tree[rt<<1].left;
     25     tree[rt].right=tree[rt<<1|1].right;
     26     if(tree[rt].left==mid-L+1)
     27         tree[rt].left+=tree[rt<<1|1].left;
     28     if(tree[rt].right==R-mid)
     29         tree[rt].right+=tree[rt<<1].right;
     30 }
     31 void Update(int x,int val,int L,int R,int rt)
     32 {
     33     if(L==R)
     34         tree[rt].left=tree[rt].right=val;
     35     else
     36     {
     37         int mid=(L+R)>>1;
     38         if(x<=mid)
     39             Update(x,val,L,mid,rt<<1);
     40         else
     41             Update(x,val,mid+1,R,rt<<1|1);
     42         PushUp(mid,L,R,rt);
     43     }
     44 }
     45 int Query(int x,int L,int R,int rt)
     46 {
     47     if(L==R)
     48         return tree[rt].left;
     49     int mid=(L+R)>>1;
     50     if(x<=mid)
     51     {
     52         if(tree[rt<<1].left==mid-L+1)
     53             return tree[rt<<1].left+tree[rt<<1|1].left;
     54         else if(L+tree[rt<<1].left>x)
     55             return tree[rt<<1].left;
     56         else if(x>mid-tree[rt<<1].right)
     57             return tree[rt<<1].right+tree[rt<<1|1].left;
     58         else
     59             return Query(x,L,mid,rt<<1);
     60     }
     61     else
     62     {
     63         if(tree[rt<<1|1].right==R-mid)
     64             return tree[rt<<1|1].right+tree[rt<<1].right;
     65         else if(x<mid+1+tree[rt<<1|1].left)
     66             return tree[rt<<1].right+tree[rt<<1|1].left;
     67         else if(x>R-tree[rt<<1|1].right)
     68             return tree[rt<<1|1].right;
     69         else
     70             return Query(x,mid+1,R,rt<<1|1);
     71     }
     72 }
     73 int main()
     74 {
     75     int n,m,x;
     76     char ch;
     77     while(~scanf("%d%d",&n,&m))
     78     {
     79         Build(1,n,1);
     80         for(;!st.empty();st.pop());
     81         while(m--)
     82         {
     83             scanf(" %c",&ch);
     84             if(ch=='D')
     85             {
     86                 scanf("%d",&x);
     87                 st.push(x);
     88                 Update(x,0,1,n,1);
     89             }
     90             else if(ch=='Q')
     91             {
     92                 scanf("%d",&x);
     93                 printf("%d\n",Query(x,1,n,1));
     94             }
     95             else
     96             {
     97                 if(!st.empty())
     98                 {
     99                     Update(st.top(),1,1,n,1);
    100                     st.pop();
    101                 }
    102             }
    103         }
    104     }
    105     return 0;
    106 }
    新博客:www.zhixiangli.com
  • 相关阅读:
    ftp
    vmware虚拟机如何安装ubuntu14.10系统
    第1章 初识java----Java简介
    fiddler
    Program Files 与Program Files (x86)
    跟我一起认识axure(三)
    React-FlipOver-Counter(日历翻页)
    vue2-vux-fitness-project
    cloud-music
    跟我一起认识axure(二)
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2514546.html
Copyright © 2011-2022 走看看