3226. [SDOI2008]校门外的区间【线段树】
Description
|
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
Output
Sample Input
D [3,3]
S [2,4]
C (1,5)
I (2,3]
Sample Output
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]校门外的区间【线段树】的更多相关文章
- [SDOI2008] 校门外的区间 - 线段树
U T 即将区间 \(T\) 范围赋值为 \(1\) I T 即将区间 \(U - T\) 范围赋值为 \(0\) D T 即将区间 \(T\) 赋值为 \(0\) C T 由于 \(S=T-S=T( ...
- [bzoj3226][Sdoi2008]校门外的区间——线段树
题目 略 题解 直接套黄学长模板. Orz 代码 #include <bits/stdc++.h> using namespace std; #define ll long long #d ...
- bzoj 3226 [Sdoi2008]校门外的区间(线段树)
3226: [Sdoi2008]校门外的区间 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 615 Solved: 227[Submit][Stat ...
- 3226: [Sdoi2008]校门外的区间
链接 思路 bug漫天飞... 维护一颗线段树,支持区间赋值,和区间异或.因为会处理到一些方括号还是圆括号的问题,所以对于每一个下标都乘2,假设中间有一个.5即可,都变成了方括号,输出在处理一下. U ...
- BZOJ 3226: [Sdoi2008]校门外的区间
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3226 题意:初始集合S为空.模拟四种集合操作:集合并.交.差.补集并. 思路:区间 ...
- BZOJ-3226 校门外的区间 线段数+拆点(类似的思想)
shabi题....bzoj关键字检查freopen??可怕,,1A的卡了一小时.... 3226: [Sdoi2008]校门外的区间 Time Limit: 10 Sec Memory Limit: ...
- 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 : ...
- 「BZOJ3226」[Sdoi2008]校门外的区间
题目 首先是开闭区间的处理,我们把\(1.5\)这种数加进来,用\([1.5,6]\)来表示\((2,6]\) 根据离散数学的基本知识,尝试把五个操作转化成人话 把\([x,y]\)变成\(1\) 把 ...
- BZOJ3226: [Sdoi2008]校门外的区间
感觉很有趣的题呢. 每个点拆成两个,线段树维护. 不过这题难点其实在输入输出. #include<bits/stdc++.h> #define N (1<<17) #defin ...
随机推荐
- Struts2 学习笔记--Action Method--接收参数
struts2中的路径问题 注意:在jsp中”/”表示tomcat服务器的根目录,在struts.xml配置文件中”/”表示webapp的根路径,即MyEclipse web项目中的WebRoot路径 ...
- NSDictionary 和NSArray 排序(sort)
排序: NSMutableDictionary *dic=[[NSMutableDictionary alloc]init]; [dic setValue:@"第3个" forKe ...
- hdu Rescue 1242
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- 深入理解MyBatis的原理:整个体系
前言:工作中虽然用到了 MyBatis,可完全不知道为什么,再不学习就晚了,这里将记录我的学习笔记,整个 MyBatis 的体系. 一.简介 1.传统的JDBC JDBC 是一种典型的桥接模式. 使用 ...
- Nib加载的方式实现自定义TableView
实现的效果 实现原理: 通过在主界面中用Bundle 的LoadNib的方式进行自定义窗体文件加载并渲染界面 实现步骤 Step One 创建TableViewCell 窗体 Step Two 定义接 ...
- Drupal8学习之路--官网文档碎碎记--主题篇
主要记录一些琐碎的知识点. 1.“In Drupal 8 drupal_add_css(), drupal_add_js() and drupal_add_library()were removed ...
- flutter Row里面元素居中显示
直接上代码: new Expanded( flex: , child: new Row( children: <Widget>[ Expanded( child: new Containe ...
- mysql 客户端
MySQL是基于C/S模式的数据库管理系统.MySQL公司开发了众多的客户端软件来帮助用户管理MySQL软件,最著名的就是 MySQL Command Line Client 和 MySQL-Work ...
- [翻译] 扩张卷积 (Dilated Convolution)
英文原文: Dilated Convolution 简单来说,扩张卷积只是运用卷积到一个指定间隔的输入.按照这个定义,给定我们的输入是一个2维图片,扩张率 k=1 是通常的卷积,k=2 的意思是每个输 ...
- jquery validation表单验证插件。
这个是刚学的,觉得对以后挺有用的,就想把自己所学的分享一下. 校验规则: (1)required:true 必输字段 (2)number:true 必须输入合法的数字(负数,小数) (3)digits ...