题目

首先是开闭区间的处理,我们把\(1.5\)这种数加进来,用\([1.5,6]\)来表示\((2,6]\)

根据离散数学的基本知识,尝试把五个操作转化成人话

  1. 把\([x,y]\)变成\(1\)

  2. 把\([0,x-1]\)和\([y+1,inf]\)变成\(0\)

  3. 把\([x,y]\)变成\(0\)

  4. 把\([x,y]\)取反,之后来一个二操作

  5. 把\([x,y]\)取反

于是线段树维护一下区间覆盖就好了

记得覆盖标记和取反标记只能同时存在一个就好了

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define LL long long
#define re register
#define maxn 150005
inline int read() {
int x=0,f=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='(')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
if(ch==')')f=1;
return x*2-f;
}
char opt[3];
int rev[maxn<<2],tag[maxn<<2];
int d[maxn<<2],l[maxn<<2],r[maxn<<2];
void build(int x,int y,int i) {
l[i]=x,r[i]=y;tag[i]=-1;
if(x==y) return;
int mid=x+y>>1;
build(x,mid,i<<1),build(mid+1,y,i<<1|1);
}
inline void pushdown(int i) {
if(tag[i]!=-1) {
rev[i<<1]=rev[i<<1|1]=0;
tag[i<<1]=tag[i<<1|1]=tag[i];
d[i<<1]=d[i<<1|1]=tag[i];
tag[i]=-1;
}
if(rev[i]) {
d[i<<1|1]^=1,d[i<<1]^=1;
if(tag[i<<1]!=-1) tag[i<<1]^=1;
else rev[i<<1]^=1;
if(tag[i<<1|1]!=-1) tag[i<<1|1]^=1;
else rev[i<<1|1]^=1;
rev[i]=0;
}
}
void change(int x,int y,int val,int i) {
if(x<=l[i]&&y>=r[i]) {
d[i]=val;tag[i]=val;
if(rev[i]) rev[i]=0;
return;
}
pushdown(i);
int mid=l[i]+r[i]>>1;
if(x<=mid) change(x,y,val,i<<1);
if(y>=mid+1) change(x,y,val,i<<1|1);
}
void solve(int x,int y,int i) {
if(x<=l[i]&&y>=r[i]) {
d[i]^=1;
if(tag[i]!=-1) tag[i]^=1;
else rev[i]^=1;
return;
}
pushdown(i);
int mid=l[i]+r[i]>>1;
if(x<=mid) solve(x,y,i<<1);
if(y>=mid+1) solve(x,y,i<<1|1);
}
int query(int pos,int i) {
if(l[i]==r[i]) return d[i];
pushdown(i);
int mid=l[i]+r[i]>>1;
if(pos<=mid) return query(pos,i<<1);
return query(pos,i<<1|1);
}
int main() {
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
build(1,150000,1);
while(scanf("%s",opt)!=EOF) {
int x=read()+2,y=read()+2;
if(opt[0]=='U') change(x,y,1,1);
if(opt[0]=='I') change(1,x-1,0,1),change(y+1,150000,0,1);
if(opt[0]=='D') change(x,y,0,1);
if(opt[0]=='C') change(1,x-1,0,1),change(y+1,150000,0,1),solve(x,y,1);
if(opt[0]=='S') solve(x,y,1);
//if(opt[0]=='I') break;
}
int st=-1,lst=-1,flag=0;
for(re int i=1;i<=150000;i++) {
if(query(i,1)) {
if(st==-1) st=i;
lst=i;
}
else {
if(st!=-1) {
if(flag) putchar(' ');
else flag=1;
if(st&1) putchar('(');
else putchar('[');
printf("%d",st/2-1);
putchar(',');
printf("%d",(lst+1)/2-1);
if(lst&1) putchar(')');
else putchar(']');
}
lst=st=-1;
}
}
if(!flag) puts("empty set");
return 0;
}

「BZOJ3226」[Sdoi2008]校门外的区间的更多相关文章

  1. bzoj 3226 [Sdoi2008]校门外的区间(线段树)

    3226: [Sdoi2008]校门外的区间 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 615  Solved: 227[Submit][Stat ...

  2. 3226. [SDOI2008]校门外的区间【线段树】

    Description   受校门外的树这道经典问题的启发,A君根据基本的离散数学的知识,抽象出5种运算维护集合S(S初始为空)并最终输出S.现在,请你完成这道校门外的树之难度增强版——校门外的区间. ...

  3. BZOJ3226[Sdoi2008]校门外的区间 题解

    题目大意: 有5种运算维护集合S(S初始为空)并最终输出S. 5种运算如下: U T  S∪T I T S∩T D T  S-T C T T-S S T S⊕T 基本集合运算如下: A∪B {x : ...

  4. BZOJ3226: [Sdoi2008]校门外的区间

    感觉很有趣的题呢. 每个点拆成两个,线段树维护. 不过这题难点其实在输入输出. #include<bits/stdc++.h> #define N (1<<17) #defin ...

  5. [bzoj3226][Sdoi2008]校门外的区间——线段树

    题目 略 题解 直接套黄学长模板. Orz 代码 #include <bits/stdc++.h> using namespace std; #define ll long long #d ...

  6. 【分块】bzoj3226 [Sdoi2008]校门外的区间

    题解见 : http://blog.csdn.net/iamzky/article/details/41088151 ORZ ZKY 2个懒标记:是否翻转,覆盖成了什么. 怎么处理一个块上有两个标记的 ...

  7. BZOJ 3226: [Sdoi2008]校门外的区间

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3226 题意:初始集合S为空.模拟四种集合操作:集合并.交.差.补集并. 思路:区间 ...

  8. 3226: [Sdoi2008]校门外的区间

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

  9. [SDOI2008] 校门外的区间 - 线段树

    U T 即将区间 \(T\) 范围赋值为 \(1\) I T 即将区间 \(U - T\) 范围赋值为 \(0\) D T 即将区间 \(T\) 赋值为 \(0\) C T 由于 \(S=T-S=T( ...

随机推荐

  1. 关于vue.js中slot的理解

    slot这块看官网文档,起初有点不懂,仔细研究还是最终理解了,slot是用来干嘛的呢,先看下一个例子: <script src="https://unpkg.com/vue/dist/ ...

  2. [javaSE] GUI(菜单)

    菜单MenuBar Menu  MenuItem 调用Frame对象的setMenuBar()方法,设置菜单,参数:MenuBar对象 import java.awt.FlowLayout; impo ...

  3. Spring学习笔记:spring与mybatis四种整合方法

    1.采用数据映射器(MapperFactoryBean)的方式,不用写mybatis映射文件,采用注解方式提供相应的sql语句和输入参数.  (1)Spring配置文件: <!-- 引入jdbc ...

  4. MySQL 数据类型总结及选取准则

    整数 整数有 TINYINT, SMALLINT, MEDIUMINT, INT 和 BIGINT 类型. 占用    8          ,  16            24,          ...

  5. CODEFORCES 429B 动态规划

    http://codeforces.com/problemset/problem/429/B 可以参考这篇文章: http://blog.csdn.net/pure_lady/article/deta ...

  6. 快速幂取模(POJ 1995)

    http://poj.org/problem?id=1995 以这道题来分析一下快速幂取模 a^b%c(这就是著名的RSA公钥的加密方法),当a,b很大时,直接求解这个问题不太可能 利用公式a*b%c ...

  7. 如何使用火狐浏览器的Poster插件进行post请求

    原文:http://blog.csdn.net/cjm2484836553/article/details/72453907 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] ...

  8. Pig集群安装

    1.安装hadoop 这个之前已经写过 2.下载Pig,解压 3.保证Java和Hadoop已经在/etc/profile中配置 4.配置Pig安装目录 export PIG_INSTALL=/hom ...

  9. c# 控制台定时程序

    using System; using System.Timers; namespace DaoChuCore2 { class Program { static void Main(string[] ...

  10. 三年Linux运维工作总结教训

    Linux运维一定要知道的六类好习惯和23个教训,避免入坑! 从事运维三年半,遇到过各式各样的问题,数据丢失,网站挂马,误删数据库文件,黑客攻击等各类问题. 今天简单整理一下,分享给各位小伙伴. 一. ...