题目

首先是开闭区间的处理,我们把\(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. xcopy命令的其他参数

    xcopy /s /e /h "c:\123" "D:\123\" 后面多一个斜杠,让程序知道是目录 以下还给您提供了 xcopy 命令的其他参数: /A 仅复 ...

  2. checkebox 全选 ,子复选框单个全部选择后,全选框也会被选择

    <script> //点击全选,子复选框被选中 function demo(){ var allcheck=document.getElementById("allcheck&q ...

  3. JavaScript数组的三种定义方法

    数组的定义: <script type="text/javascript"> // <!--声明数组--> // 1.先声明数组长度,后进行赋值 var a ...

  4. WCF 之部署(2010版本之上)

    首先,在WIN系统下打开IIS,每种操作系统是不同的,请不要弄混. 1.控制面板---左下放的程序---启用或关闭Windows功能,如图: 2.找到Internet Information Serv ...

  5. 面向对象(基础oop)之初识继承

    大家好,我叫李京阳,,很高兴认识大家,之所以我想开一个自己的博客,就是来把自己所了解的知识点通过自己的话写一下,希望被博客园的朋友们点评和一起讨论一下,也希望从博客园中多认识一些软件开发人员!现在我开 ...

  6. block中self关键字的使用-防止self 被retain一次

    在代码块中使用对象的成员时(成员变量是属性strong,MRC估计是retain时效果一样,使用方法时也一样): 警告: capturing self strongly in this block i ...

  7. 十、获取异步线程返回值Callable

    一.简介 异步线程的实现接口Runnable是无法获得返回结果的,而另一个接口Callable可以返回结果.并通过如Future等方式来获取异步结果. 二.代码示例 import java.util. ...

  8. 浅谈Android项目----JSON解析(4种解析技术详解)

    json简介 1.概念:json全称是javaScript object Notation,是一种并轻量级的数据交换格式. 2.特点: 1.本质就是具有特定格式的字符串 2.json完全独立于编程语言 ...

  9. HDFS 的运行机制

    hdfs haddop distributed system 由 name node, secondary name node,data node, client 组成. 真正存放数据的就是 data ...

  10. ant-design里为了清空Modal中的值, modal 中值有缓存 ....

    处理列表中的编辑功能,发现有点爽,看的都是上次编辑后内容, 搜文档 也没说具体怎么清空旧的状态 网上搜了下,说给 moal 设置一个不同的key 试了,用这方式可以解决问题,  只要这个key是全新的 ...