题目大意:

  有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. jq点击和鼠标移上效果以及一个等号"=" 二个等号"==" 三个等号"===" 的区别

    <body> <div class="a" bs='1' style="width:100px; height:30px; border:1px sol ...

  2. HDU1294 Rooted Trees Problem(整数划分 组合数学 DP)

    讲解见http://www.cnblogs.com/IMGavin/p/5621370.html, 4 可重组合 dfs枚举子树的节点个数,相乘再累加  1 #include<iostream& ...

  3. play-framework的安装与使用

    一.下载: 到http://www.playframework.com/download下载 解压好包,然后输入: activator ui 访问:http://127.0.0.1:8888/home

  4. Java Data Type

    官方文档:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html 转载地址:http://blog.csdn.n ...

  5. 两个本地(localhost)html文件之间的传值

    什么是iframe? iframe 元素会创建包含另外一个文档的内联框架(即行内框架).可以理解为把iframe解释成“浏览器中的浏览器“ 在IE中: document.frames[i].docum ...

  6. struct 类型重定义

    类型定义的那个头文件只需要在功能源文件里#include 开始在主函数源文件里也#include,所以出现了重定义

  7. 4类 JavaScript 内存泄露及如何避免

    原文:4 Types of Memory Leaks in JavaScript and How to Get Rid Of Them笔记:涂鸦码龙 译者注:本文并没有逐字逐句的翻译,而是把我认为重要 ...

  8. 学习linux内核时常碰到的汇编指令(2)

    转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvh.html JNGE∶指令助记符——(有符号数比较)不大于且不等于转移(等价于JL).当SF和OF异 ...

  9. 自己yy的Splay

    #include <iostream> #include <cstdio> #include <queue> using namespace std; ; stru ...

  10. Redis 的 5 个常见使用场景

    2015-07-22 23:31:46 本文由 伯乐在线 - 刘晓鹏 翻译,黄利民 校稿.未经许可,禁止转载!英文出处:Joe Engel.欢迎加入翻译组. 在这篇文章中,我们将阐述 Redis 最常 ...