题目

首先是开闭区间的处理,我们把\(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. .NET中的集合-ArrayList1

    集合命名空间: using.System.Collections;(非泛型集合) using.System.Collections.Genneric(泛型集合) 常用的集合 1.“类似数组”集合:Ar ...

  2. c#项目代码风格要求

    代码风格没有正确与否,重要的是整齐划一,这是我拟的一份<.Net 项目代码风格要求>,供大家参考. 1. C# 代码风格要求 1.1注释 类型.属性.事件.方法.方法参数,根据需要添加注释 ...

  3. string转xml

    //string转xml XmlDocument doc = new XmlDocument(); doc.LoadXml(temp); XmlNodeList nodes1 = doc.GetEle ...

  4. Cheatsheet: 2017 08.01 ~ 09.30

    Golang Building a Worker Pool in Golang A Million WebSockets and Go Writing Plugins in Go imgproxy:R ...

  5. 前端(七):ES6一些新特性

    一.变量 1.var关键字的弊端 var关键字的弊端:1.可以重复声明变量:2.无法限制变量修改:3.没有块级作用域,只有函数作用域. <html lang="en"> ...

  6. [LeetCode] Add Two Numbers题解

    Add Two Numbers: You are given two non-empty linked lists representing two non-negative integers. Th ...

  7. golang 的md5加密

    先看实现代码: package main import (     "crypto/md5"     "encoding/hex"     "fmt& ...

  8. Q:接口与抽象类

    博文回答一下两个问题: 接口和抽象类的区别 选用接口和抽象类的依据 对于问题1: 从java语法的角度上来说,接口的所有成员和方法都是public的,且其方法均为abstract的.直到jdk1.8之 ...

  9. 并发模型之Master-Worker设计模式

    一.Master-Worker设计模式 Master-Worker模式是常用的并行设计模式.它的核心思想是,系统有两个进程协议工作:Master进程和Worker进程.Master进程负责接收和分配任 ...

  10. 一类划分关系和指数级生成函数,多项式exp的关系

    划分关系 姑且这么叫着 设满足性质 \(A\) 的集合为 \(S_A\),每个元素有标号 如果 \(S_B\) 是由若干个 \(S_A\) 组成的一个大集合 设 \(a_i\) 表示大小为 \(i\) ...