Description

 
  受校门外的树这道经典问题的启发,A君根据基本的离散数学的知识,抽象出5种运算维护集合S(S初始为空)并最终输出S。现在,请你完成这道校门外的树之难度增强版——校门外的区间。
 
  5种运算如下:
S∪T
S∩T
S-T
T-S
S⊕T
 
  基本集合运算如下:
{x : xÎA or xÎB}
{x : xÎA and xÎB}
{x : xÎA and xÏB}
(A-B)∪(B-A)
 

Input

  输入共M行。
  每行的格式为X T,用一个空格隔开,X表示运算的种类,T为一个区间(区间用(a,b), (a,b], [a,b), [a,b]表示)。
 

Output

 
  共一行,即集合S,每个区间后面带一个空格。若S为空则输出"empty set"。
 

Sample Input

U [1,5]
D [3,3]
S [2,4]
C (1,5)
I (2,3]

Sample Output

(2,3)

HINT

对于 100% 的数据,0≤a≤b≤65535,1≤M≤70000

0代表没有,1代表有
U并:T区间*0 +1
I交:T区间外*0
D减:T区间*0
C(T-S):T外面的*0,然后T*-1  +1
S:T区间-1 *-1
然后每个点拆成三个点,用来处理开区间和闭区间

 #include<iostream>
#include<cstring>
#include<cstdio>
#define LL long long
#define N (300000)
using namespace std;
struct emm
{
LL val,add,mul;
}Segt[N*];
LL opt,x,y,n=;
char st[]; void Pushdown(LL node,LL l,LL r)
{
if (Segt[node].mul!=)
{
Segt[node*].mul*=Segt[node].mul;
Segt[node*+].mul*=Segt[node].mul;
Segt[node*].add*=Segt[node].mul;
Segt[node*+].add*=Segt[node].mul; Segt[node*].val*=Segt[node].mul;
Segt[node*+].val*=Segt[node].mul;
Segt[node].mul=;
}
if (Segt[node].add!=)
{
Segt[node*].add+=Segt[node].add;
Segt[node*+].add+=Segt[node].add;
LL mid=(l+r)/;
Segt[node*].val+=(mid-l+)*Segt[node].add;
Segt[node*+].val+=(r-mid)*Segt[node].add;
Segt[node].add=;
}
} LL Query(LL node,LL l,LL r,LL l1,LL r1)
{
if (l>r1 || r<l1) return ;
if (l1<=l && r<=r1)
return Segt[node].val;
Pushdown(node,l,r);
LL mid=(l+r)/;
return Query(node*,l,mid,l1,r1)+Query(node*+,mid+,r,l1,r1);
} void Add(LL node,LL l,LL r,LL l1,LL r1,LL k)
{
if (l>r1 || r<l1) return;
if (l1<=l && r<=r1)
{
Segt[node].val+=(r-l+)*k;
Segt[node].add+=k;
return;
}
Pushdown(node,l,r);
LL mid=(l+r)/;
Add(node*,l,mid,l1,r1,k);
Add(node*+,mid+,r,l1,r1,k);
Segt[node].val=Segt[node*].val+Segt[node*+].val;
} void Mul(LL node,LL l,LL r,LL l1,LL r1,LL k)
{
if (l>r1 || r<l1) return;
if (l1<=l && r<=r1)
{
Segt[node].mul*=k;
Segt[node].add*=k;
Segt[node].val*=k;
return;
}
Pushdown(node,l,r);
LL mid=(l+r)/;
Mul(node*,l,mid,l1,r1,k);
Mul(node*+,mid+,r,l1,r1,k);
Segt[node].val=Segt[node*].val+Segt[node*+].val;
} void Init()
{
if (st[]=='U') opt=;
if (st[]=='I') opt=;
if (st[]=='D') opt=;
if (st[]=='C') opt=;
if (st[]=='S') opt=;
cin>>st;
x=,y=;
LL s=;
while ()
{
if (st[s]==',') break;
x=x*+st[s]-''; s++;
}
for (LL i=s+;i<=strlen(st)-;++i)
y=y*+st[i]-'';
x=x*+;
if (st[]=='(') x++;
y=y*+;
if (st[strlen(st)-]==')') y--;
} void print()
{
bool flag=false,refun=false;
LL i=;
while (i<=n)
{
if (!flag && (i-)%+>= && Query(,,n,i,i)>)
{
flag=true;refun=true;
if ((i-)%+==) cout<<'['; else cout <<'(';
cout<<(i-)/<<',';
}
if (flag && Query(,,n,i,i)<=)
{
flag=false;refun=true;
cout<<(i-)/;
if ((i-)%+>=) cout<<"] "; else cout <<") ";
}
++i;
}
if (!refun) cout<<"empty set";
} int main()
{
for (LL i=;i<=n*;++i) Segt[i].mul=;
LL i=;
while (cin>>st)
{
Init();
i++;
if (opt==) Mul(,,n,x,y,),Add(,,n,x,y,);
if (opt==) Mul(,,n,,x-,),Mul(,,n,y+,n,);
if (opt==) Mul(,,n,x,y,);
if (opt==) Mul(,,n,,x-,),Mul(,,n,y+,n,),Mul(,,n,x,y,-),Add(,,n,x,y,);
if (opt==) Add(,,n,x,y,-),Mul(,,n,x,y,-);
}
print();
}

3226. [SDOI2008]校门外的区间【线段树】的更多相关文章

  1. [SDOI2008] 校门外的区间 - 线段树

    U T 即将区间 \(T\) 范围赋值为 \(1\) I T 即将区间 \(U - T\) 范围赋值为 \(0\) D T 即将区间 \(T\) 赋值为 \(0\) C T 由于 \(S=T-S=T( ...

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

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

  3. bzoj 3226 [Sdoi2008]校门外的区间(线段树)

    3226: [Sdoi2008]校门外的区间 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 615  Solved: 227[Submit][Stat ...

  4. 3226: [Sdoi2008]校门外的区间

    链接 思路 bug漫天飞... 维护一颗线段树,支持区间赋值,和区间异或.因为会处理到一些方括号还是圆括号的问题,所以对于每一个下标都乘2,假设中间有一个.5即可,都变成了方括号,输出在处理一下. U ...

  5. BZOJ 3226: [Sdoi2008]校门外的区间

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3226 题意:初始集合S为空.模拟四种集合操作:集合并.交.差.补集并. 思路:区间 ...

  6. BZOJ-3226 校门外的区间 线段数+拆点(类似的思想)

    shabi题....bzoj关键字检查freopen??可怕,,1A的卡了一小时.... 3226: [Sdoi2008]校门外的区间 Time Limit: 10 Sec Memory Limit: ...

  7. 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 : ...

  8. 「BZOJ3226」[Sdoi2008]校门外的区间

    题目 首先是开闭区间的处理,我们把\(1.5\)这种数加进来,用\([1.5,6]\)来表示\((2,6]\) 根据离散数学的基本知识,尝试把五个操作转化成人话 把\([x,y]\)变成\(1\) 把 ...

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

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

随机推荐

  1. 委托,匿名方法,lamda快速理解

    转载于用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树     这些对老一代的程序员都是老生常谈的东西,没什么新意,对新生代的程序员却充满着魅力.曾经新生代,好多都经过漫长的学习,理解,实 ...

  2. SpringMVC作用、SpringMVC核心组件、创建项目流程

    SpringMVC框架 1. 作用 解决了V-C的交互问题,即视图与控制器的交互问题. 在原生的Java EE技术中,使用Servlet作为项目中的控制器,用于接收用户的请求,并给予响应结果.这种做法 ...

  3. react组件里阻事件冒泡

    e.nativeEvent.stopImmediatePropagation();

  4. display:inline-block居中方式

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  5. CentOS7系列--5.3CentOS7中配置和管理Kubernetes

    CentOS7配置和管理Kubernetes Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署容器,那么可以将D ...

  6. vue router 配合transition 切换动画

    把<router-view>嵌套在<transition>里,路由变化的时候,vue会为包裹页面的div增加动画样式,我们要做的就是监听路由变化.定义这些动画样式,以规定页面到 ...

  7. private 与 super

    public class Person { private String name; private int age; } public class Student extends Person { ...

  8. 带你从零学ReactNative开发跨平台App开发-[react native 仿boss直聘](十三)

    ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...

  9. lock free数据结构内存回收技术-hazard pointer

    lock free数据结构一般来说拥有比基于lock实现的数据结构更高的性能,但是其实现比基于lock的实现更为复杂,需要处理的难题包括预防ABA问题,内存如何重用和回收等.通常,最简单最有效的处理A ...

  10. Jmeter入门--断言(检查点)

    断言是在请求的返回层面增加一层判断机制.因为请求成功,并不代表结果一定正确,因为此需要检查机制提高测试准确性. 1.响应断言 模式匹配规则: 包括:返回结果包括你指定的内容,支持正则匹配 例如: 响应 ...