题目大意:

  有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]校门外的区间 题解的更多相关文章

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

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

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

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

  3. BZOJ3226: [Sdoi2008]校门外的区间

    感觉很有趣的题呢. 每个点拆成两个,线段树维护. 不过这题难点其实在输入输出. #include<bits/stdc++.h> #define N (1<<17) #defin ...

  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. php JS和JQ

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. BI 项目管理之生命周期跟踪和任务区域

    DW/BI 系统是复杂的实体,构建这种系统的方法必须有助于简化复杂性.13 个方框显示了构建成功的数据仓库的主要任务区域,以及这些任务之间的主要依赖关系.       在生命周期这一级可以进行多方观察 ...

  3. windows下Tomcat配置多实例

    详情参见tomcat安装目录下RUNNING.txt中Advanced Configuration - Multiple Tomcat Instances部分. 问题源于下面这段tomcat官方文档的 ...

  4. 【leetcode】Remove Duplicates from Sorted Array

    题目描述: Given a sorted array, remove the duplicates in place such that each element appear only once a ...

  5. apache https配置步骤

    转自:http://www.cnblogs.com/best-jobs/p/3298258.html 1.  确认是否安装ssl模块 是否有mod_ssl.so文件 2.  生成证书和密钥 linux ...

  6. android在代码中四种设置控件(以及TextView的文字颜色)背景颜色的方法

      http://blog.csdn.net/fth826595345/article/details/9208771 主题 TextView 转载请注明出处: http://blog.csdn.ne ...

  7. loj 1337

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1337 思路:对于搜过的区域进行标记,如果要求的点落在已经搜过的区域,那么直接取出来即可 ...

  8. javase基础笔记3——this关键字和内存图

    什么是面向对象? 面向过程. 面向过程:解决一个问题的思路和方法以及步骤 面向对象:把一些具有相同特征的问题抽象成一个对象,用""""对象.方法()" ...

  9. XML 文件解析

    1.XML文件 <Data> <Movie id="1"> <title>good lucky to you</title> < ...

  10. 序列化 Serializable

    1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object states,但 ...