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 ...
随机推荐
- $("input[name=name]").val(); 无法获取值问题
<input type="text" class="text" name="name" placeholder= 例如:上海" ...
- 【转载&&干货】Noip应试技巧
NOIP应试技巧 如何看待别人的经验? 我想大家都有台上的学长滔滔不绝,但是自己在台下漠不关心,或是老师考试前的叮嘱说完一会儿功夫就忘记了的经历吧.所以,有可能我接下来的所说的话,一到考场上就全部忘记 ...
- POJ 2480 Longge's problem 欧拉函数—————∑gcd(i, N) 1<=i <=N
Longge's problem Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6383 Accepted: 2043 ...
- Q:链表的中间元素
问题:如何得到一个链表的中间元素? 相信,这个问题对于刚入门编程的人来说,都不会难,最自然而然的想法是先遍历一遍链表,统计链表中的元素的个数,之后,再走一遍链表,所走的步长为链表长度的一半.这样就 ...
- Ubuntu使用心得
因为开发学习需要,也接触了一些Ubuntu系统,玩崩了两次系统之后,也学到了一些东西. -------------------------------------------------------- ...
- python 函数私有方法
#coding:utf-8 class A(object): def _test1(self): print('this is _test1') def test2(self): print('thi ...
- LINUX创建LVM、PV、VG、LV ORACLE服务器方案划分
为裸盘分区 查看硬盘分区 fdisk -l 进入分区管理 fdisk /dev/sda 创建PV 创建PV pvcreate /dev/sda1 pvcreate /dev/sdb1 pvcreate ...
- linq中如何实现多个条件的联合查询
目前接触处理数据这一块比较多,在处理内存中的数据源的时候我一般使用的是linq,linq使用起来像sql语句一样,用法简单,功能强大. 最近需要实现一个从两个不同的文件读取不同的数据,然后根据这两个数 ...
- sqlserver年月日转汉字大写--自定义函数--繁体
两个自定义函数结合 函数一: create function convertNumToChinese ()) ) as begin ) ' set @temStr = '壹' ' set @temSt ...
- 原生爬虫小Demo
import re from urllib import request class Spider(): url = 'https://www.panda.tv/cate/lol' #[\s\S]匹配 ...