• [bzoj 3226]校门外的区间


    题意

    image

    输出最后的集合

     

    题解

    校门外的树会做吧

    区间知道是什么东西吧

    校门外的区间会做了吧

    image

    image

    昨天做个大线段树没做出来,今天做个小线段树压压惊

    py一下输入数据,然后操作变成:

    U 区间涂1
    I 两侧区间涂0
    D 区间涂0
    C 两侧涂0,中间取反
    S 区间取反

    #include<map>
    #include<stack>
    #include<queue>
    #include<cstdio>
    #include<string>
    #include<vector>
    #include<cstring>
    #include<complex>
    #include<iostream>
    #include<assert.h>
    #include<algorithm>
    using namespace std;
    #define inf 1001001001
    #define infll 1001001001001001001LL
    #define ll long long
    #define dbg(vari) cerr<<#vari<<" = "<<(vari)<<endl
    #define gmax(a,b) (a)=max((a),(b))
    #define gmin(a,b) (a)=min((a),(b))
    #define Ri register int
    #define gc getchar()
    #define il inline
    il int read(){
        Ri x=0,f=0;char ch;
        while(!isdigit(ch=gc))if(ch=='(')f=-1;
        while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=gc;}
        if(ch==')')f=1;
        return x*2-f;
    }
    #define gi read()
    #define FO(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
    #define N 131073
    char ch[5];
    struct seg{int l,r,val,tag,rev;}t[4*N];
    void build(int k,int l,int r){
        t[k]=(seg){l,r,0,-1,0};
        if(l==r)    return;
        int mid=(l+r)>>1;
        build(k<<1,l,mid);
        build(k<<1|1,mid+1,r);
    }
    void pushdown(int k){
        int tag=t[k].tag,rev=t[k].rev;
        t[k].tag=-1;t[k].rev=0;
        if(t[k].l==t[k].r){
            if(tag!=-1)t[k].val=tag;
            t[k].val^=rev;;
            return;
        }
        if(tag!=-1){
            t[k<<1].tag=t[k<<1|1].tag=tag;
            t[k<<1].rev=t[k<<1|1].rev=0;
        }
        t[k<<1].rev^=rev;t[k<<1|1].rev^=rev;
    }
    int query(int k,int x){
        pushdown(k);
        int l=t[k].l,r=t[k].r;
        if(l==r)    return t[k].val;
        int mid=(l+r)>>1;
        if(x<=mid)
            return query(k<<1,x);
        else 
            return query(k<<1|1,x);
    }
    void modify(int k,int x,int y,int val){
        if(y<x)return;
        pushdown(k);
        int l=t[k].l,r=t[k].r;
        if(l==x&&y==r){
            if(val==-1)    t[k].rev^=1;
            else t[k].tag=val;
            return;
        }
        int mid=(l+r)>>1;
        if(y<=mid)
            modify(k<<1,x,y,val);
        else if(x>mid)
            modify(k<<1|1,x,y,val);
        else {
            modify(k<<1,x,mid,val);
            modify(k<<1|1,mid+1,y,val);
        }
    }
    int main(){
        build(1,1,N);
        while(scanf("%s",ch)!=EOF){
            int a=gi,b=gi;
            a+=2;b+=2;
            switch(ch[0]){
                case 'U':modify(1,a,b,1);break;
                case 'I':modify(1,1,a-1,0);modify(1,b+1,N,0);break;
                case 'D':modify(1,a,b,0);break;
                case 'C':modify(1,1,a-1,0);modify(1,b+1,N,0);modify(1,a,b,-1);break;
                case 'S':modify(1,a,b,-1);break;
            }
        }
        int start=-1,last=-1,flag=0;
        for(int i=1;i<=N;i++)
            if(query(1,i)){
                if(start==-1)start=i;
                last=i;
            }
            else{
                if(start!=-1){
                    if(flag)printf(" ");else flag=1;
                    if(start&1)    printf("(");
                    else    printf("[");
                    printf("%d,%d",start/2-1,(last+1)/2-1);
                    if(last&1)printf(")");
                    else printf("]");
                }
                last=start=-1;
            }
        if(!flag)puts("empty set");
        return 0;
    }
  • 相关阅读:
    JAVA中对Cookie的操作
    springboot 快速开发的定制补充
    centos7 安装 mysql5.7 版本(全)
    springboot redis-cache 自动刷新缓存
    spring-data-redis-cache 使用及源码走读
    Redis 相关功能和实用命令(五)
    Redis 集群(三)
    Redis 主从,哨兵,集群实战(四)
    redis 主从复制和哨兵模式(二)
    导出 mysql 数据到 redis
  • 原文地址:https://www.cnblogs.com/chouti/p/5916041.html
Copyright © 2020-2023  润新知