• HDU 1540 Tunnel Warfare


    有N个村庄,只要村庄没有被摧毁就可以相互联系,一个村庄可以通过村庄和其他村庄联系,敌人会摧毁某个特定的村庄,然后我放可以修复最近被摧毁的村庄,然后询问第k个村庄最多可以联系到几个村庄(包括自身)

    求最大连续值问题,线段树维护区间最大连续长度,然后区间合并。

    查询的时候累加左右两边的连续值即可,注意连续区间是否会断开。

    比较坑人的是这题是多组数据。。而且每个村庄可以被多次摧毁,此时不用更新标记但是要更新栈。。就为了这两个问题WA了超多次。。

     1 #include <cstdio>
     2 #include <cstring>
     3 
     4 #define M ((L+R)>>1)
     5 #define lson rt<<1,L,M
     6 #define rson rt<<1|1,M+1,R
     7 #define len(a,b) ((b)-(a)+1)
     8 
     9 using namespace std;
    10 
    11 const int maxn = 500001;
    12 
    13 bool isdes[maxn],val;
    14 int lmax[maxn<<2],rmax[maxn<<2],tar,desed[maxn],pd;
    15 
    16 inline void pushup(int rt,int L,int R) {
    17     lmax[rt] = lmax[rt<<1];  rmax[rt] = rmax[rt<<1|1];
    18     if(!isdes[M] && !isdes[M + 1]) {
    19         if(lmax[rt<<1] == len(L,M)) lmax[rt] = lmax[rt<<1] + lmax[rt<<1|1];
    20         if(rmax[rt<<1|1] == len(M + 1,R)) rmax[rt] = rmax[rt<<1|1] + rmax[rt<<1];
    21     }
    22 }
    23 
    24 void build(int rt,int L,int R) {
    25     if(L == R) {
    26         lmax[rt] = rmax[rt] = 1;
    27         isdes[L] = false;
    28     } else {
    29         build(lson); build(rson);
    30         lmax[rt] = rmax[rt] = lmax[rt<<1] + lmax[rt<<1|1];
    31     }
    32 }
    33 
    34 void update(int rt,int L,int R) {
    35     if(L == R) {
    36         isdes[L] = val;
    37         lmax[rt] = rmax[rt] = (int)(!val);
    38     } else {
    39         if(tar <= M) update(lson);
    40         else update(rson);
    41         pushup(rt,L,R);
    42     }
    43 }
    44 
    45 int query(int t,int n) {
    46     int L = 1,R = n,rt = 1,left = 0,right = 0;
    47     if(isdes[t]) return 0;
    48     while(1) {
    49         if(L == R) return left + right + 1;
    50         if(t <= M) {
    51             if(lmax[rt<<1|1] == len(M + 1,R)) right += lmax[rt<<1|1];
    52             else right = lmax[rt<<1|1];
    53             rt = rt<<1; R = M;
    54         } else {
    55             if(rmax[rt<<1] == len(L,M)) left += rmax[rt<<1];
    56             else left = rmax[rt<<1];
    57             rt = rt<<1|1; L = M + 1;
    58         }
    59     }
    60 }
    61 
    62 int main() {
    63     int N,m;
    64     char cmd;
    65     while(scanf("%d%d",&N,&m) != EOF) {
    66         memset(desed,0,sizeof(desed));
    67         pd = 0;
    68         build(1,1,N);
    69         for(int c = 0;c < m;c++) {
    70             scanf(" %c",&cmd);
    71             if(cmd == 'R') {
    72                 if(!pd) continue;
    73                 while(pd && desed[pd - 1] == false) pd--;
    74                 tar = desed[--pd];
    75                 val = false;
    76                 update(1,1,N);
    77             } else {
    78                 scanf("%d",&tar);
    79                 if(cmd == 'D') {
    80                     desed[pd++] = tar;
    81                     if(isdes[tar]) continue;
    82                     val = true;
    83                     update(1,1,N);
    84                 } else printf("%d
    ",query(tar,N));
    85             }
    86         }
    87     }
    88     return 0;
    89 }
  • 相关阅读:
    文件上传漏洞全面渗透姿势总结
    注册frpc为windows服务,可在未登录用户时启动
    SpringIOC 容器注入方式
    如何交换 Integer 的值?
    分布式websocket服务器
    win10安装Hbase2.3.0
    hadoop常用的命令
    win10安装kafka 2.122.8.1
    win10激活码
    win10 flume source为spooldir,输出到hdfs
  • 原文地址:https://www.cnblogs.com/rolight/p/3474860.html
Copyright © 2020-2023  润新知