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个懒标记:是否翻转,覆盖成了什么. 怎么处理一个块上有两个标记的 ...
随机推荐
- 夺命雷公狗ThinkPHP项目之----企业网站10之栏目的编辑完善(无限极分类的完成)
我们编辑首先就要考虑将下拉框效果实现出来,然后再进行下一步操作: 我们用到了Model层的操作,在第8讲里面其实已经写好了catTree方法,控制器如下所示: 然后在列表页然他变量进行输出 然后开始通 ...
- z/os上的tar和gzip(3)
前面两篇文章分别讲过了如何合并并压缩批量文件,如何解压缩并恢复批量文件, 这些问题解决了之后还剩下一个大问题,如何在网络上传输这些压缩过的文件,如果是linux的话非常简单,制定binary,然后ge ...
- 原生js获取execl里面的值 主要使用ActiveXObject
今天一个程序员给了一个excel表,里面有一百多条数据,叫我一个一个数据的复制到系相应的函数里面比如 put("gaga1","gaga2"),这样一句话,要我 ...
- 鸟哥的linux私房菜学习记录之认识系统服务(daemons)
- Mac Book 上安装Windows 8 / 10 以后安装 Hyper-v 无法正常使用问题---虚拟化已禁止问题
Mac book由于工作需要装了双启动,平时工作用 Windows 10, 由于有些老程序无法启动,还得再装一个虚拟机. 起初装 WMWare 开始装 7.1版本,结果没安装完就直接崩溃重启, 网上反 ...
- android 中 listview 设置自动匹配高度
1.布局文件 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:l ...
- 使用ActionFilterAttribute 记录 WebApi Action 请求和返回结果记录
使用ActionFilterAttribute 记录 WebApi Action 请求和返回结果记录 C#进阶系列——WebApi 异常处理解决方案 [ASP.NET Web API教程]4.3 AS ...
- 【转载】perl接受传递参数的方法
#! /usr/bin/perl use Getopt::Std;use warnings;use strict; sub read_from_sh($) { my $file = shift; my ...
- -Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m
-Xms 最小堆的大小, 也就是当你的虚拟机启动后, 就会分配这么大的堆内存给你 -Xmx 是最大堆的大小 当最小堆占满后,会尝试进行GC,如果GC之后还不能得到足够的内存(GC未必会收集到所有当前可 ...
- HDU 4315:Climbing the Hill(阶梯博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=4315 题意:有n个人要往坐标为0的地方移动,他们分别有一个位置a[i],其中最靠近0的第k个人是king,移动的 ...