感觉很有趣的题呢。

每个点拆成两个,线段树维护。

不过这题难点其实在输入输出。

#include<bits/stdc++.h>
#define N (65535<<1)
#define M (l+r>>1)
#define P (k<<1)
#define S (k<<1|1)
#define K l,r,k
#define L l,M,P
#define R M+1,r,S
#define Z \
int l=0,int r=N,int k=1
int u[1<<18],v[1<<18],a[N+10];
template<int d>
void same(int k){
u[k]=d;
v[k]=0;
}
void flip(int k){
(~u[k]?u[k]:v[k])^=1;
}
void (*operate[3])(int)
={same<0>,same<1>,flip};
void devolve(int k){
int d=v[k]?2:u[k];
if(~d){
operate[d](P);
operate[d](S);
v[k]=0;
u[k]=-1;
}
}
void A(int d,int s,int t,Z){
if(s==l&&t==r)
operate[d](k);
else{
devolve(k);
if(t<=M)
A(d,s,t,L);
else if(s>M)
A(d,s,t,R);
else{
A(d,s,M,L);
A(d,M+1,t,R);
}
}
}
void finish(Z){
if(~u[k])
for(int i=l;i<=r;++i)
a[i]=u[k];
else{
devolve(k);
finish(L);
finish(R);
}
}
bool empty(){
for(int i=0;i<=N;++i)
if(a[i])
return 0;
return 1;
}
int main(){
memset(u,-1,sizeof u);
char d[2],b[16];
while(~scanf("%s%s",d,b)){
char u,v;
int s,t;
sscanf(b,"%c%d,%d%c",&u,&s,&t,&v);
s=s*2+(u=='(');
t=t*2-(v==')');
if(s>t)
continue;
switch(*d){
case'D':
A(0,s,t);
break;
case'U':
A(1,s,t);
break;
case'S':
A(2,s,t);
break;
default:
if(s)
A(0,0,s-1);
if(t!=N)
A(0,t+1,N);
if(*d=='C')
A(2,s,t);
}
}
finish();
if(empty())
puts("empty set");
else
for(int i=0;i<=N;++i){
if((!i||!a[i-1])&&a[i])
printf("%c%d,",i&1?'(':'[',i>>1);
if(a[i]&&!a[i+1])
printf("%d%c ",i+1>>1,i&1?')':']');
}
}

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

  1. 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 : ...

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

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

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

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

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

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

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

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

  6. 「BZOJ3226」[Sdoi2008]校门外的区间

    题目 首先是开闭区间的处理,我们把\(1.5\)这种数加进来,用\([1.5,6]\)来表示\((2,6]\) 根据离散数学的基本知识,尝试把五个操作转化成人话 把\([x,y]\)变成\(1\) 把 ...

  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. Sql server使用Merge关键字做插入或更新操作

    Merge是关于对于两个表之间的数据进行操作的. 要使用Merge的场景比如: 数据同步 数据转换 基于源表对目标表做Insert,Update,Delete操作 MERGE语句的基本语法: MERG ...

  2. Eclipse自动补全功能管理

    #这种方法只适用于Eclipse Classic版本(这个版本带有插件的源码) 在使用Eclispe的过程,感觉自动补全做的不好,没有VS的强大.下面说两个增强自动补全的方法: 1.增加Eclipse ...

  3. Matlab生成M序列的伪随机码

    伪随机编码中较常用的是m序列,它是线性反馈移位寄存器序列的一种,其特点是在相同寄存器级数的情况下输出序列周期最长.线性反馈移位寄存器的工作原理是,给定所有寄存器一个初始值,当移位脉冲到来时,将最后一级 ...

  4. mac 设置阿里企业邮箱

    接收邮件服务器:pop3.mxhichina.com或pop3.您的域名,端口:110 发送邮件服务器:smtp.mxhichina.com或smtp.您的域名,端口:25 IMAP协议设置 接收邮件 ...

  5. oracle去重等基础问题

    --去重查询方法一:根据id select * from sxe where id in(select min(id) from sxe group by username) order by id ...

  6. 快速向表中插入大量数据Oracle中append与Nologging

    来源于:http://blog.sina.com.cn/s/blog_61cd89f60102e7gi.html 当需要对一个非常大的表INSERT的时候,会消耗非常多的资源,因为update表的时候 ...

  7. 如何改变tableview的section的颜色

    方法一:调用 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ UIV ...

  8. 【POJ 2406】Power Strings 连续重复子串

    看的<后缀数组——处理字符串的有力工具>这篇论文,在那里这道题是用后缀数组实现的,复杂度为$O(nlogn)$,很明显长度为$2×10^6$的数据会TLE,所以必需得用复杂度为$O(n)$ ...

  9. 用CSS和jQuery制作简单的下拉框

    请选择 百度 谷歌 雅虎 新浪 dowebok 代码 素材 模板 教程 示例下载 // li', function() { var parent = $(this).closest('.select' ...

  10. C语言与套接字

    我们已经知道如何使用I/O与文件通信,还知道了如何让同一计算机上的两个进程进行通信,这篇文章将创建具有服务器和客户端功能的程序 互联网中大部分的底层网络代码都是用C语言写的. 网络程序通常有两部分组成 ...