• 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
  • 相关阅读:
    JavaScript内存泄漏(转)
    深入理解JavaScript的变量作用域(转)
    Spring MVC 配置(备忘)
    French fashion in Paris
    Windows Server 2003、 WindowsXP, 中和 Windows 2000 中的缓存凭据安全
    doc.txt.exe病毒。
    Exchange server 增加RBL
    无以穷尽的工作。。。
    windows SBS Exchange 数据库恢复
    VLAN介绍
  • 原文地址:https://www.cnblogs.com/shangyu/p/3222886.html
Copyright © 2020-2023  润新知