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 : xÎA or xÎB}
A∩B {x : xÎA and xÎB}
A-B {x : xÎA and xÏB}
A⊕B (A-B)∪(B-A)
思路:
每个数之间加入一个数,就像这样2 2.5 3 3.5 4 [2,3) -> [2,2.5] (3,4] -> [3.5,4] 用01表示集合,则U 区间涂1;I 两侧区间涂0;D 区间涂0;C 两侧涂0,中间取反;S 区间取反。用线段树解决,标记的下传很重要(被坑了)。
代码:
#include<cstdio>
#include<iostream>
#define n 131073
using namespace std; int lazy[n<<],num[n<<],rev[n<<]; int read()
{
int x=,y=;
char ch=getchar();
while (ch<'' || ch>'')
{
if (ch=='(') y=;
ch=getchar();
}
while (ch>='' && ch<='')
{
x=x*+ch-;
ch=getchar();
}
if (ch==')') y=-;
return x*+y+;
} void push_down(int x,int l,int r)
{
int y=lazy[x],z=rev[x];
lazy[x]=-,rev[x]=;
if (l==r)
{
if (y!=-) num[x]=y;
num[x]^=z;
return;
}
if (y!=-)
{
lazy[x<<]=lazy[x<<|]=y;
rev[x<<]=rev[x<<|]=;
}
rev[x<<]^=z,rev[x<<|]^=z;
} void add(int L,int R,int l,int r,int cur,int val)
{
if (l>r) return;
push_down(cur,L,R);
if (l<=L && r>=R)
{
if (val<) lazy[cur]=val;
else rev[cur]^=;
return;
}
int mid=L+R>>;
if (l>mid) add(mid+,R,l,r,cur<<|,val);
else if (r<=mid) add(L,mid,l,r,cur<<,val);
else add(L,mid,l,mid,cur<<,val),add(mid+,R,mid+,r,cur<<|,val);
} int ask(int l,int r,int x,int cur)
{
push_down(cur,l,r);
if (l==r) return num[cur];
int mid=l+r>>;
if (x<=mid) return ask(l,mid,x,cur<<);
else return ask(mid+,r,x,cur<<|);
} int main()
{
char ch[];
for (int i=;i<=n*;i++) lazy[i]=-;
while (scanf("%s",ch)!=EOF)
{
int a=read(),b=read();
if (ch[]=='U') add(,n,a,b,,);
if (ch[]=='I') add(,n,,a-,,),add(,n,b+,n,,);
if (ch[]=='D') add(,n,a,b,,);
if (ch[]=='C') add(,n,,a-,,),add(,n,a,b,,),add(,n,b+,n,,);
if (ch[]=='S') add(,n,a,b,,);
}
int h=,t=,flag=;
for (int i=;i<=n;i++)
if (ask(,n,i,))
{
if (!h) h=i;
t=i;
}
else
{
if (h)
{
if (flag) printf(" ");
else flag=;
if (h&) printf("(");
else printf("[");
printf("%d,%d",h/-,(t+)/-);
if (t&) printf(")");
else printf("]");
}
h=t=;
}
if (!flag) printf("empty set");
else printf(" ");
return ;
}
BZOJ3226[Sdoi2008]校门外的区间 题解的更多相关文章
- [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个懒标记:是否翻转,覆盖成了什么. 怎么处理一个块上有两个标记的 ...
- BZOJ3226: [Sdoi2008]校门外的区间
感觉很有趣的题呢. 每个点拆成两个,线段树维护. 不过这题难点其实在输入输出. #include<bits/stdc++.h> #define N (1<<17) #defin ...
- 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]校门外的区间
题目 首先是开闭区间的处理,我们把\(1.5\)这种数加进来,用\([1.5,6]\)来表示\((2,6]\) 根据离散数学的基本知识,尝试把五个操作转化成人话 把\([x,y]\)变成\(1\) 把 ...
- 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( ...
随机推荐
- hdu 1290 切糕
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1290 思路: n条直线最多能将一个平面分成几个区域其递推公式即为:f(n)=f(n-1)+n:递推一下 ...
- Oracle数据库备份与还原操作具体步骤
Oracle数据库导出操作 导入导出都要进行目录创建与授权. 在pl/sql里面编写也可以 select * from dba_directories(这个是查看创建的目录) drop directo ...
- WCF分布式开发必备知识(1):MSMQ消息队列
本章我们来了解下MSMQ的基本概念和开发过程.MSMQ全称MicroSoft Message Queue,微软消息队列,是在多个不同应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一 ...
- Delphi中怎么结束线程(这个线程是定时执行的)(方案二)
上篇博客中提出了一个问题:怎么结束一个定时循环执行的线程,并给出了一个解决方案,但是又出现了一个问题,详细去参考上一篇博客. 然后出去撒了个尿,突然脑子里出现了一个想法(看来工作和思考久了,出去走走, ...
- 檢查RAC狀態
1.使用srvctl工具檢查RAC當前配置和狀態 $ srvctl config database -h Displays the configuration for the database. Us ...
- vector的主要操作
vector常用方法 assign() 对Vector中的元素赋值 void assign( input_iterator start, input_iterator end ); // void a ...
- 回忆一次面试Android研发的问题
有NDK开发JNI程序经验优先 intent intentfileter 阿里云 线程,异步 1.图片缓冲2.解压3.获取搜索记录 4.在安卓开发过程中用到那些框架
- 在Salesforce中编写Unit Test
Unit Test 也是一个 Class 文件,所以在创建 Unit Test 的时候要选择 Test Class 类型来创建,请看如下截图(在Eclipse中): 编写 Unit Test 基本流程 ...
- javase基础笔记4——异常/单例和类集框架
继承 extends final关键 多态 是在继承的基础上 接口 interface 异常 exception 包的访问可控制权限 private default protect public 异常 ...
- hbase伪分布式安装(转)
原文地址:http://blog.csdn.net/yonghutwo/article/details/24555103 本机环境: ubuntu 12.4 Hadoop 1.1.2 安装hbase版 ...