• 3226: [Sdoi2008]校门外的区间


    链接

    思路

      bug漫天飞。。。

      维护一颗线段树,支持区间赋值,和区间异或。因为会处理到一些方括号还是圆括号的问题,所以对于每一个下标都乘2,假设中间有一个.5即可,都变成了方括号,输出在处理一下。

    • U  [l,r]赋值为1
    • I   [0,l-1],[r+1,n]赋值为0
    • D [l,r]区间涂0
    • C [0,l-1],[r+1,n]赋值为0,[l,r]区间异或
    • S [l,r]区间异或

    bug列表:乘2后从0开始,因为0*2=0,0.5*2=1,zz的居然是从2开始的。。

    读入的区间并不都是一位数。。。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<iostream>
     6 
     7 using namespace std;
     8 const int N = 1000100;
     9 
    10 int tag[N],xr[N],ans[N];
    11 char opt[10],s[10];
    12 bool fir = true;
    13 
    14 #define lson l,mid,rt<<1
    15 #define rson mid+1,r,rt<<1|1
    16 
    17 void pushdown(int rt) {
    18     if (tag[rt]!=-1) {
    19         tag[rt<<1] = tag[rt<<1|1] = tag[rt];
    20         xr[rt<<1] = xr[rt<<1|1] = 0;
    21         tag[rt] = -1;
    22     }
    23     if (xr[rt]) {    
    24         xr[rt<<1] ^= 1;xr[rt<<1|1] ^= 1;
    25         xr[rt] = 0;
    26     }
    27 }
    28 void update(int l,int r,int rt,int L,int R,int x) {
    29     if (L <= l && r <= R) {
    30         if (x != -1) tag[rt] = x,xr[rt] = 0;
    31         else xr[rt] ^= 1;
    32         return ;
    33     }
    34     pushdown(rt);
    35     int mid = (l + r) / 2;
    36     if (L <= mid) update(lson,L,R,x);
    37     if (R > mid)  update(rson,L,R,x);
    38 }
    39 void query(int l,int r,int rt) {
    40     if (l == r) {
    41         if (tag[rt]!=-1) ans[l] = tag[rt];
    42         ans[l] ^= xr[rt];
    43         return ;
    44     }
    45     pushdown(rt);
    46     int mid = (l + r) / 2;
    47     query(lson);query(rson);
    48 }
    49 void get(int &L,int &R) {
    50     char c=getchar();int flag;
    51     while (c!='('&&c!='[')  c=getchar();
    52     scanf("%d",&L);
    53     flag = (c=='('); L = (L*2)+flag;
    54     c = getchar();scanf("%d",&R);c = getchar();
    55     flag = -(c!=']');R = (R*2)+flag;
    56 }
    57 int main () {
    58 
    59     int n = 140000,L,R,lt;
    60     memset(tag,-1,sizeof(tag));
    61 
    62     while (scanf("%s",opt)!=EOF) {
    63         get(L,R); //-
    64         if (opt[0]=='U') {
    65             update(0,n,1,L,R,1);
    66         }
    67         else if (opt[0]=='I') {
    68             if (L-1 >= 0) update(0,n,1,0,L-1,0);
    69             if (R+1 <= n) update(0,n,1,R+1,n,0);
    70         }
    71         else if (opt[0]=='D') {
    72             update(0,n,1,L,R,0);
    73         }
    74         else if (opt[0]=='C') {
    75             if (L-1 >= 0) update(0,n,1,0,L-1,0);
    76             if (R+1 <= n) update(0,n,1,R+1,n,0);
    77             update(0,n,1,L,R,-1);
    78         }
    79         else {
    80             update(0,n,1,L,R,-1);
    81         }
    82     }
    83     query(0,n,1);
    84     int pos=0,flag=0;
    85     for (int i=0; i<=n; i=pos+1) {
    86         pos=i;
    87         if (!ans[i]) continue;
    88         if (flag) printf(" "); 
    89         flag=1;
    90         
    91         while (ans[pos+1]) pos++;
    92         if (i&1) printf("(%d,",i/2);
    93         else printf("[%d,",i/2);
    94         if (pos&1)  printf("%d)",(pos+1)/2);
    95         else printf("%d]",pos/2);
    96     }
    97     if (!flag)  puts("empty set");//-
    98     return 0;
    99 }
  • 相关阅读:
    贝壳找房魔法师顾问[并查集+DAG判断]
    Ubuntu 18.04 安装 virtualbox
    Ubuntu 编译安装 nDPI
    Ubuntu 16.04 安装WPS
    HDU 5046 Airport【DLX重复覆盖】
    Codeforces 622C Not Equal on a Segment 【线段树 Or DP】
    UVA 10635 Prince and Princess【LCS 问题转换为 LIS】
    LA 2995 Image Is Everything
    LA 3708 Graveyard
    HDU 5212 Code【莫比乌斯反演】
  • 原文地址:https://www.cnblogs.com/mjtcn/p/8829206.html
Copyright © 2020-2023  润新知