「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( ...
随机推荐
- C# 之VS程序打包
VS2012没有自带打包工具,所以要先下载并安装一个打包工具.我采用微软提供的打包工具: InstallShield2015LimitedEdition.下载地址:http://pan.baidu. ...
- SQL Server中的流控制语句
begin···end 该语句定义sql代码块,通常在if和while语句中使用 declare @num int ; ; begin ; print 'hello word' end if···el ...
- mysql数据库重点(基础优化)
### Mysql性能优化 尽量不要写select * ,如果需要全表数据,使用select 加所有字段列名称查询代替* 尽量减少字段列的数学计算,如:where num * 2 >= 30,可 ...
- vue的简单测试
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C++输入输出流--<iostream>详解
C++输入输出流包含在头文件<iostream>中, 流的定义如下:通过设备驱动程序与键盘.屏幕.文件.打印机等进行交互, iostream 类提供与之交互的方法.输出流:输出流的对象是字 ...
- mybatis-generator 动态生成实体对象、dao 以及相关的xml映射文件
.新建maven空项目 2.修改pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <proje ...
- git杂记-查看历史提交
普通查看:git log.输入q退出比较. $ git log commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chacon ...
- window.addEventListener绑定事件记得删除
在做postMessage通信时,window.addEventListener绑定的事件记得要remove掉 就和setTime一样,不然占用内存资源
- Storm-Concept
1. Storm集群架构 strom jar all-your-code.jar backtype.storm.MyWordCounterTopology arg1 arg2 这个命 ...
- Hive、Spark SQL、Impala比较
Hive.Spark SQL.Impala比较 Hive.Spark SQL和Impala三种分布式SQL查询引擎都是SQL-on-Hadoop解决方案,但又各有特点.前面已经讨论了Hi ...