BZOJ 3226: [Sdoi2008]校门外的区间
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3226
题意:初始集合S为空。模拟四种集合操作:集合并、交、差、补集并。
思路:区间有开区间闭区间,首先区间左右都乘以2,这样闭区间在偶数位置,开区间在奇数位置。然后就是区间染色颜色反转两个操作。注意区间染色时,若有反转标记则清除;反转时若有染色标记则直接将染色反转即可。
const int N=70005; struct node { int L,R; int re,color; void fill(int c) { if(re) re=0; color=c; } void reverse() { if(color!=-1) color^=1; else { re^=1; } } }; node a[N<<3]; void build(int t,int L,int R) { a[t].L=L; a[t].R=R; a[t].color=0; a[t].re=0; if(L==R) return; int M=(L+R)>>1; build(t<<1,L,M); build(t<<1|1,M+1,R); } void pushDown(int t) { if(a[t].L==a[t].R) return; if(a[t].color!=-1) { a[t<<1].fill(a[t].color); a[t<<1|1].fill(a[t].color); a[t].color=-1; } if(a[t].re) { a[t<<1].reverse(); a[t<<1|1].reverse(); a[t].re=0; } } void fill(int t,int L,int R,int c) { if(L>R) return; if(a[t].L==L&&a[t].R==R) { a[t].fill(c); return; } pushDown(t); int M=(a[t].L+a[t].R)>>1; if(R<=M) fill(t<<1,L,R,c); else if(L>M) fill(t<<1|1,L,R,c); else { fill(t<<1,L,M,c); fill(t<<1|1,M+1,R,c); } } void rev(int t,int L,int R) { if(L>R) return; if(a[t].L==L&&a[t].R==R) { a[t].reverse(); return; } pushDown(t); int M=(a[t].L+a[t].R)>>1; if(R<=M) rev(t<<1,L,R); else if(L>M) rev(t<<1|1,L,R); else { rev(t<<1,L,M); rev(t<<1|1,M+1,R); } }; vector<pair<int,int> > V; void dfs(int t) { if(a[t].color==1) { V.pb(MP(a[t].L,a[t].R)); return; } if(a[t].color==0) return; pushDown(t); dfs(t<<1); dfs(t<<1|1); } int main() { int n=N<<1; build(1,0,n); char op,ll,rr; int l,r; while(scanf("%c %c%d,%d%c\n",&op,&ll,&l,&r,&rr)!=-1) { l<<=1; r<<=1; if(ll=='(') l++; if(rr==')') r--; if(op=='U') fill(1,l,r,1); else if(op=='I') fill(1,0,l-1,0),fill(1,r+1,n,0); else if(op=='D') fill(1,l,r,0); else if(op=='C') fill(1,0,l-1,0),fill(1,r+1,n,0),rev(1,l,r); else rev(1,l,r); } dfs(1); if(SZ(V)==0) { puts("empty set"); return 0; } int i; int tot=SZ(V); for(i=0;i<tot-1;i++) { if(V[i].second+1==V[i+1].first) V[i+1].first=V[i].first; else { if(V[i].first&1) putchar('('); else putchar('['); printf("%d,%d",V[i].first>>1,V[i].second+1>>1); if(V[i].second&1) putchar(')'); else putchar(']'); putchar(' '); } } if(V[i].first&1) putchar('('); else putchar('['); printf("%d,%d",V[i].first>>1,V[i].second+1>>1); if(V[i].second&1) putchar(')'); else putchar(']'); putchar(' '); puts(""); }
BZOJ 3226: [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.现在,请你完成这道校门外的树之难度增强版——校门外的区间. ...
- 3226: [Sdoi2008]校门外的区间
链接 思路 bug漫天飞... 维护一颗线段树,支持区间赋值,和区间异或.因为会处理到一些方括号还是圆括号的问题,所以对于每一个下标都乘2,假设中间有一个.5即可,都变成了方括号,输出在处理一下. U ...
- 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]校门外的区间
题目 首先是开闭区间的处理,我们把\(1.5\)这种数加进来,用\([1.5,6]\)来表示\((2,6]\) 根据离散数学的基本知识,尝试把五个操作转化成人话 把\([x,y]\)变成\(1\) 把 ...
- [SDOI2008] 校门外的区间 - 线段树
U T 即将区间 \(T\) 范围赋值为 \(1\) I T 即将区间 \(U - T\) 范围赋值为 \(0\) D T 即将区间 \(T\) 赋值为 \(0\) C T 由于 \(S=T-S=T( ...
- 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个懒标记:是否翻转,覆盖成了什么. 怎么处理一个块上有两个标记的 ...
随机推荐
- oracle的表空间
创建表空间 1:创建单个文件的表空间 CREATE TABLESPACE SAMPLE LOGGING DATAFILE 'D:\11.dbf' SIZE 5M REUSE EXTENT MANAGE ...
- 夺命雷公狗---Thinkphp----11之管理员的增删改查的完善
由于我们刚才的帐号还没通过任何的验证就可以直接进入数据库了,这当然不是不合理的交互逻辑,所以我们要修改下,让他变得3合理一些, 所以我们还是要按照套路来修改几处即可解决问题: 首先修改下添加的控制器: ...
- 利用 iptables 命令限制单个端口的并发连接数
iptables -I INPUT -p tcp --dport 11251:11300 -m connlimit --connlimit-above 10 -j REJECT 以上代码意思: 在IN ...
- SQL Server 数据库中关于死锁的分析
SQL Server数据库发生死锁时不会像Oracle那样自动生成一个跟踪文件.有时可以在[管理]->[当前活动] 里看到阻塞信息(有时SQL Server企业管理器会因为锁太多而没有响应). ...
- n阶乘 尾数0的个数
class Solution {public: int trailingZeroes(int n) { if(n<=0) return 0; int i=0; ...
- rotate array 旋转数组
class Solution {public: void rotate(vector<int>& nums, int k) { int n=nums.size(); int i=0 ...
- MySQL重置root用户密码的方法
本教程适用于采用Win2003.WinXP操作系统的迅美VPS和云主机产品. 当管理员忘记MySQL密码怎么办?屡次输入密码,仍然提示错误,网站无法正常运行,数据库也无法管理,管理员束手无策. 网站程 ...
- 10、会话管理/编程实战分析/Jsp
1 会话管理回顾 会话管理 1)会话管理: 管理浏览器和服务器之间的会话过程中产生的会话数据 2)Cookie技术: 会话数据保存在浏览器客户端. Cookie核心的API: 2.1 在服务器端创建C ...
- codeigniter db操作方法
链接数据库 ——- $this->load->database();//手动连接数据库 //连接多数据库 $DB1 = $this->load->database(‘group ...
- 使用Symfony 2在三小时内开发一个寻人平台
简介 Symfony2是一个基于PHP语言的Web开发框架,有着开发速度快.性能高等特点.但Symfony2的学习曲线也比 较陡峭,没有经验的初学者往往需要一些练习才能掌握其特性. 本文通过一个快速开 ...