「BZOJ3226」[Sdoi2008]校门外的区间
首先是开闭区间的处理,我们把\(1.5\)这种数加进来,用\([1.5,6]\)来表示\((2,6]\)
根据离散数学的基本知识,尝试把五个操作转化成人话
把\([x,y]\)变成\(1\)
把\([0,x-1]\)和\([y+1,inf]\)变成\(0\)
把\([x,y]\)变成\(0\)
把\([x,y]\)取反,之后来一个二操作
把\([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]校门外的区间的更多相关文章
- bzoj 3226 [Sdoi2008]校门外的区间(线段树)
3226: [Sdoi2008]校门外的区间 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 615 Solved: 227[Submit][Stat ...
- 3226. [SDOI2008]校门外的区间【线段树】
Description 受校门外的树这道经典问题的启发,A君根据基本的离散数学的知识,抽象出5种运算维护集合S(S初始为空)并最终输出S.现在,请你完成这道校门外的树之难度增强版——校门外的区间. ...
- 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 : ...
- BZOJ3226: [Sdoi2008]校门外的区间
感觉很有趣的题呢. 每个点拆成两个,线段树维护. 不过这题难点其实在输入输出. #include<bits/stdc++.h> #define N (1<<17) #defin ...
- [bzoj3226][Sdoi2008]校门外的区间——线段树
题目 略 题解 直接套黄学长模板. Orz 代码 #include <bits/stdc++.h> using namespace std; #define ll long long #d ...
- 【分块】bzoj3226 [Sdoi2008]校门外的区间
题解见 : http://blog.csdn.net/iamzky/article/details/41088151 ORZ ZKY 2个懒标记:是否翻转,覆盖成了什么. 怎么处理一个块上有两个标记的 ...
- BZOJ 3226: [Sdoi2008]校门外的区间
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3226 题意:初始集合S为空.模拟四种集合操作:集合并.交.差.补集并. 思路:区间 ...
- 3226: [Sdoi2008]校门外的区间
链接 思路 bug漫天飞... 维护一颗线段树,支持区间赋值,和区间异或.因为会处理到一些方括号还是圆括号的问题,所以对于每一个下标都乘2,假设中间有一个.5即可,都变成了方括号,输出在处理一下. U ...
- [SDOI2008] 校门外的区间 - 线段树
U T 即将区间 \(T\) 范围赋值为 \(1\) I T 即将区间 \(U - T\) 范围赋值为 \(0\) D T 即将区间 \(T\) 赋值为 \(0\) C T 由于 \(S=T-S=T( ...
随机推荐
- IO流的复习笔记
IO字节流和缓冲流 IO字节流的读取和写入 读取 import java.io.FileInputStream; import java.io.FileNotFoundException; impor ...
- 实习小结(二)--- SSM框架搭建
SSM项目框架搭建 前几天做了一个学生信息管理的项目,使用纯控制台输入,查询数据库,将信息在控制台中打印,功能完善得差不多之后,老师让将这个项目移植到Web中,使用Spring+SpringMVC+M ...
- CentOS-Linux系统下安装Tomcat
步骤1:解压Tomcat 命令: unzip apache-tomcat-8.5.20.zip 步骤2:将tomcat 移动到“/usr/local/src/java/tomcat8.5”下并重命名 ...
- jvm 内存机制
jvm 的内存包括stack ,Heap,NonHeap,在此重点说明Heap,NonHeap. Heap叫堆内存,它用于存放类实例和数组信息.NonHeap叫非堆内存,用于存放类,方法等可反射的对象 ...
- C#语言数据类型
整数类型 sbyte -128~127之间 byte 0~255 short(Int16) -32768~32768 ushort(UInt16) 0~65535 Int (Int32) ...
- Bzoj2780: [Spoj]8093 Sevenk Love Oimaster
题目 传送门 Sol 就是广义\(sam\) 然后记录下每个状态属于哪些串,开\(set\)维护 \(parent\)树上启发式合并一下就好了 # include <bits/stdc++.h& ...
- BZOJ4568: [Scoi2016]幸运数字(线性基 倍增)
题意 题目链接 Sol 线性基是可以合并的 倍增维护一下 然后就做完了?? 喵喵喵? // luogu-judger-enable-o2 #include<bits/stdc++.h> # ...
- BZOJ4011: [HNOI2015]落忆枫音(dp 乘法原理)
题意 题目链接 Sol 非常妙的一道题 设\(inder[i]\)表示\(i\)号节点的度数 首先如果是个DAG的话,可以考虑在每个点的入边中选一条边作为树形图上的边,这样\(ans = \prod_ ...
- 为什么推荐用ui-router替代ngRoute
初学angularjs,第一个实例是官网的phoneCat,里面路由用的是ngRoute,后来看到别的用ui-router,觉得好奇,ui-route是什么呢?百度一些,得到如下解释: ui-rout ...
- Spring mvc与Struts2的比较
1. 机制:spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同. 2. 性能:spring会稍微比struts快.spring mvc是基于方法的设 ...