zoukankan      html  css  js  c++  java
  • POJ2892Tunnel Warfare (线段树)

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

    记录每个区间端点的左连续及右连续 都是单点更新 用不着向下更新 还简单点

    找错找了N久 最后发现将s[w<<1|1]写成s[w<<1+1]了

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 #define N 50010
     7 int lr[N<<2],rr[N<<2],stack[N<<2];
     8 void build(int l,int r,int w)
     9 {
    10     lr[w] = rr[w] = r-l+1;
    11     if(l==r)
    12     return ;
    13     int m = (l+r)>>1;
    14     build(l,m,w<<1);
    15     build(m+1,r,w<<1|1);
    16 }
    17 void pushup(int l,int r,int w)
    18 {
    19     int m = (l+r)>>1;
    20     lr[w] = lr[w<<1];
    21     rr[w] = rr[w<<1|1];
    22     if(lr[w<<1]==m-l+1)
    23     lr[w] += lr[w<<1|1];
    24     if(rr[w<<1|1]==r-m)
    25     rr[w]+=rr[w<<1];
    26 }
    27 void update(int p,int d,int l,int r,int w)
    28 {
    29     if(l==r)
    30     {
    31         lr[w] = d;
    32         rr[w] = d;
    33         return ;
    34     }
    35     int m = (l+r)>>1;
    36     if(p<=m)
    37     update(p,d,l,m,w<<1);
    38     else
    39     update(p,d,m+1,r,w<<1|1);
    40     pushup(l,r,w);
    41 }
    42 int query(int p,int l,int r,int w)
    43 {
    44     if(lr[w]==r-l+1)
    45     return lr[w];
    46     if(l==r)
    47     return 0;
    48     int m = (l+r)>>1;
    49     if(p<=m)
    50     {
    51         if(m-rr[w<<1]<p)
    52         return rr[w<<1]+lr[w<<1|1];
    53         return query(p,l,m,w<<1);
    54     }
    55     else
    56     {
    57         if(m+lr[w<<1|1]>=p)
    58         return lr[w<<1|1]+rr[w<<1];
    59         return query(p,m+1,r,w<<1|1);
    60     }
    61 }
    62 int main()
    63 {
    64     int n,m,k,g=0;
    65     char ss[5];
    66     while(cin>>n>>m)
    67     {
    68         build(1,n,1);
    69         g=0;
    70         while(m--)
    71         {
    72             scanf("%s",ss);
    73             if(ss[0]=='D')
    74             {
    75                 scanf("%d",&k);
    76                 stack[++g] = k;
    77                 update(k,0,1,n,1);
    78             }
    79             else if(ss[0]=='Q')
    80             {
    81                 scanf("%d",&k);
    82                 printf("%d
    ",query(k,1,n,1));
    83             }
    84             else
    85             {
    86                 update(stack[g],1,1,n,1);
    87                 g--;
    88             }
    89         }
    90     }
    91     return 0;
    92 }
    View Code
  • 相关阅读:
    数独小算法,测试通过(Java)
    OC运行时和方法机制笔记
    AlertView点击确定后再执行后面的代码
    对第三方库集成方式的分析
    当程序进入后台时执行长时间代码
    iOS开发之GCD使用总结
    缓存网络请求的结果
    防止 NSTimer retain 作为 target 的 self
    获取设备唯一码
    原生网络请求以及AFN网络请求/异步下载
  • 原文地址:https://www.cnblogs.com/shangyu/p/3222886.html
Copyright © 2011-2022 走看看