poj 2892 &&hdu 1540 Tunnel Warfare

http://poj.org/problem?id=2892

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 #define maxn 51000
  5 using namespace std;
  6 
  7 int stack1[maxn],top;
  8 struct node
  9 {
 10     int l,r;
 11     int len,ren;
 12 }p[maxn*4];
 13 
 14 void up(int i)
 15 {
 16     p[i].len=p[i<<1].len; p[i].ren=p[i<<1|1].ren;
 17     if(p[i<<1].len==(p[i<<1].r-p[i<<1].l+1))
 18         p[i].len+=p[i<<1|1].len;
 19     if(p[i<<1|1].ren==(p[i<<1|1].r-p[i<<1|1].l+1))
 20         p[i].ren+=p[i<<1].ren;
 21 }
 22 void build_tree(int i,int l,int r)
 23 {
 24     p[i].l=l; p[i].r=r;
 25     if(l==r)
 26     {
 27         p[i].len=p[i].ren=1;
 28         return ;
 29     }
 30     int mid=(l+r)>>1;
 31     build_tree(i<<1,l,mid);
 32     build_tree(i<<1|1,mid+1,r);
 33     up(i);
 34 }
 35 
 36 void update(int id,int i,int oper)
 37 {
 38     if(p[i].l==p[i].r)
 39     {
 40         p[i].len=p[i].ren=oper;
 41         return;
 42     }
 43     int mid=(p[i].l+p[i].r)>>1;
 44     if(id<=mid)
 45         update(id,i<<1,oper);
 46     else
 47         update(id,i<<1|1,oper);
 48     up(i);
 49 }
 50 
 51 int search1(int id,int i)
 52 {
 53     if(p[i].l==p[i].r)
 54         return p[i].len;
 55     int mid=(p[i].l+p[i].r)>>1;
 56     if(id<=mid)
 57     {
 58         if(p[i<<1].r-p[i<<1].ren+1<=id)
 59             return p[i<<1].ren+p[i<<1|1].len;
 60         else
 61             search1(id,i<<1);
 62     }
 63     else
 64     {
 65         if(p[i<<1|1].len+p[i<<1|1].l-1>=id)
 66             return p[i<<1].ren+p[i<<1|1].len;
 67         else
 68             search1(id,i<<1|1);
 69     }
 70 }
 71 
 72 int main()
 73 {
 74     int n,q,a;
 75     while(scanf("%d%d",&n,&q)!=EOF)
 76     {
 77         build_tree(1,1,n);
 78         top=1;
 79         getchar();
 80         while(q--)
 81         {
 82             char ch;
 83             scanf("%c",&ch);
 84             if(ch=='D')
 85             {
 86                 scanf("%d",&a);
 87                 update(a,1,0);
 88                 stack1[top++]=a;
 89             }
 90             else if(ch=='Q')
 91             {
 92                 scanf("%d",&a);
 93                 printf("%d\n",search1(a,1));
 94             }
 95             else if(ch=='R')
 96             {
 97                 if(top>1)
 98                 {
 99                     update(stack1[--top],1,1);
100                 }
101             }
102             getchar();
103         }
104     }
105     return 0;
106 }
View Code

 

转载于:https://www.cnblogs.com/fanminghui/p/3557071.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值