题目大意:

  有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. js继承的概念

    js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现继承,可以用js ...

  2. C# SMTP邮件发送 分类: C# 2014-07-13 19:10 333人阅读 评论(1) 收藏

    邮件发送在网站应用程序中经常会用到,包括您现在看到的博客,在添加评论后,系统会自动发送邮件通知到我邮箱的,把系统发送邮件的功能整理了下,做了一个客户端Demo,希望对有需要的童鞋有所帮助: 核心代码: ...

  3. Oracle 11g新特性 -- 延迟段

    11gR2之前的版本中,当创建一张表时,会自动分配段空间,这样做有几个弊端: 1. 初始创建表时就需要分配空间,自然会占用一些时间,如果初始化多张表,这种影响就被放大. 2. 如果很多表开始的一段时间 ...

  4. ASP.NET Identity 3.0教程

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:我相信有些人和我一样,已经开始把ASP.NET 5用于产品开发了.不过现在最大的问题是 ...

  5. CentOS安装中文支持

    部分文档突然成乱码了. 解决方法: 1.安装中文支持包 # yum groupinstall "Chinese Support" 2 修改# /etc/sysconfig/i18n ...

  6. HDU 4812 D Tree 树分治+逆元处理

    D Tree Problem Description   There is a skyscraping tree standing on the playground of Nanjing Unive ...

  7. javase基础笔记1——简介和发展

    软件分为 系统软件 windows linux类 (unix)mac(麦金塔).数据库管理系统 unix linux 开源os(open source) 免费 开放 free os operation ...

  8. Android学习笔记(一)——安卓开发环境搭建

    安装教程以及资源(2015.11.8最新版):链接:http://pan.baidu.com/s/1kTnOsMr 密码:0ogf

  9. LoadRunner 事务函数

    status 包括LR_PASS, LR_FAIL,  LR_AUTO,  LR_STOP(这个没用过) lr_set_transaction_instance_status(status); 可以根 ...

  10. mysql root用户 远程登录其它机器,看不到数据库

    在102上访问101上的数据库里,show databases;看不到里面的库, 需要在101上授权就可以了 GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.16 ...