Help with Intervals(集合的交并补,线段树)
很早以前做过这题,早就没印象了,估计当时也是照着某大神的代码抄过的,现在是连题意都看了好长时间。
刚开始的S集合是空集,给你一些操作和一个T集合,把操作的结果再赋给S集合。
解法:因为会有开区间和闭区间,对于一个值我拆成了两个点 比如 1,2,3, 表示的区间为[1,2] 把两个端点值分别设为2个点,把端点之间的区间也设为一个点,那么 区间就可以表示为(1,2) = 1,[1,2) = 1,2 (1,2] = 2,3 ,把这些点建成树,然后进行区间的操作,也就转换成了对点的操作。
并操作,就是直接把a-b变为1.
S-T 操作。 直接把T的区间段变为0.
T-S 操作, 这个需要特别说明一下,因为这个操作的结果是把T之外的区间清零,把T这段区间的值变为相反的,这个不能用延迟覆盖来操作,需要加一个延迟标记,表示这段区间我需要逆置。
异或操作,异或操作的结果就是 T之外的区间不变化,T这段区间逆置,跟上面类似。
如果此段已有逆置的延迟标记,再加一个的话相当于抵消。
忘记判空集 ,WA一次。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 140000
#define M 132000
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
int s[N<<],a[N],xlz[N<<],lz[N<<];
struct node
{
int l,r,f;
}p[N];
void down(int w,int m)
{
if(lz[w]!=-)
{
s[w<<] = s[w<<|] = lz[w<<] = lz[w<<|] = lz[w];
xlz[w<<] = xlz[w<<|] = ;
lz[w] = -;
}
if(xlz[w])
{
xlz[w<<] ^= ;
xlz[w<<|] ^= ;
xlz[w] = ;
}
}
void build(int l,int r,int w)
{
lz[w] = -;
xlz[w] = ;
s[w] = ;
if(l==r)
{
return ;
}
int m = (l+r)>>;
build(l,m,w<<);
build(m+,r,w<<|);
}
void update(int a,int b,int p,int d,int l,int r,int w)
{
if(a<=l&&b>=r)
{
//cout<<l<<" "<<r<<" "<<w<<endl;
if(p==)
{
s[w] = d;
lz[w] = d;
xlz[w] = ;
}
else
{
xlz[w] ^= ;
}
return;
}
down(w,r-l+);
int m = (l+r)>>;
if(a<=m) update(a,b,p,d,l,m,w<<);
if(b>m) update(a,b,p,d,m+,r,w<<|);
}
int query(int p,int l,int r,int w)
{
if(l==r)
{
if(xlz[w])
{
s[w]^=;
xlz[w] ^= ;
}
return s[w];
}
down(w,r-l+);
int m = (l+r)>>;
if(p<=m) return query(p,l,m,w<<);
else return query(p,m+,r,w<<|);
}
int main()
{
int x,y,i;
char sr[],c1,c2;
build(,M,);
while(scanf("%s",sr)!=EOF)
{
getchar();
scanf("%c%d,%d%c",&c1,&x,&y,&c2);
x = (c1=='['?*x+:*x+);
y = (c2==']'?*y+:*y);
if(sr[]=='U')
{
update(x,y,,,,M,);
}
else if(sr[]=='I')
{
if(x>)
update(,x-,,,,M,);
update(y+,M,,,,M,);
}
else if(sr[]=='D')
{
update(x,y,,,,M,);
}
else if(sr[]=='C')
{
if(x>)
update(,x-,,,,M,);
update(y+,M,,,,M,);
update(x,y,,,,M,);
}
else
{
update(x,y,,,,M,);
}
}
int g = ;
for(i = ; i <= M ;i++)
a[i] = query(i,,M,);
for(i = ; i <= M ; i++)
{
if(a[i]&&a[i]!=a[i-])
{
g++;
p[g].l = (i-)/;
p[g].f = (i%?:);
}
else if(a[i]!=a[i-])
{
p[g].r = (i-)/;
p[g].f+=((i-)%?:);
}
}
for(i = ; i <= g ;i++)
{
if(p[i].f==)
printf("(%d,%d)",p[i].l,p[i].r);
else if(p[i].f==)
printf("[%d,%d)",p[i].l,p[i].r);
else if(p[i].f==)
printf("(%d,%d]",p[i].l,p[i].r);
else
printf("[%d,%d]",p[i].l,p[i].r);
if(i!=g) printf(" ");
}
if(g==) puts("empty set");
else
puts("");
return ;
}
Help with Intervals(集合的交并补,线段树)的更多相关文章
- c++ 求集合的交并补
#include<iostream.h> #include<windows.h> #include<iomanip.h> #include<stdio.h&g ...
- java 集合交并补
通过使用泛型方法和Set来表达数学中的表达式:集合的交并补.在下面三个方法中都将第一个參数Set复制了一份,并未直接改动參数中Set. package Set; import java.util.Ha ...
- 2019南昌网络赛-I(单调栈+线段树)
题目链接:https://nanti.jisuanke.com/t/38228 题意:定义一段区间的值为该区间的和×该区间的最小值,求给定数组的最大的区间值. 思路:比赛时还不会线段树,和队友在这题上 ...
- bzoj4399 魔法少女LJJ 线段树合并+线段树二分+并查集
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4399 题解 毒瘤题 \(9\) 种操作还有支持动态图的连通性 仔细读题 $ c<=7$. ...
- poj 3225 Help with Intervals(线段树,区间更新)
Help with Intervals Time Limit: 6000MS Memory Limit: 131072K Total Submissions: 12474 Accepted: ...
- 线段树(区间操作) POJ 3325 Help with Intervals
题目传送门 题意:四种集合的操作,对应区间的01,问最后存在集合存在的区间. 分析:U T [l, r]填充1; I T [0, l), (r, N]填充0; D T [l, r]填充0; C T[0 ...
- POJ 3225 Help with Intervals --线段树区间操作
题意:给你一些区间操作,让你输出最后得出的区间. 解法:区间操作的经典题,借鉴了网上的倍增算法,每次将区间乘以2,然后根据区间开闭情况做微调,这样可以有效处理开闭区间问题. 线段树维护两个值: cov ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- 培训补坑(day7:线段树的区间修改与运用)(day6是测试,测试题解以后补坑QAQ)
补坑咯~ 今天围绕的是一个神奇的数据结构:线段树.(感觉叫做区间树也挺科学的.) 线段树,顾名思义就是用来查找一段区间内的最大值,最小值,区间和等等元素. 那么这个线段树有什么优势呢? 比如我们要多次 ...
随机推荐
- [ZJOI 2007] 捉迷藏
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1095 [算法] 首先建出点分树,然后每一个点开两个堆.“第一个堆记录子树中所有节点到 ...
- OpenResty创造者
OpenResty 是一个开源的 Web 平台,用于开发高性能和高动态的 Web 网关或者 Web 应用.OpenResty 最早是为了支持全网搜索引擎周边的相关搜索的 API 接口,后来我们基于 N ...
- .NETFramework:Timers
ylbtech-.NETFramework:Timers 1.返回顶部 1. #region 程序集 System, Version=4.0.0.0, Culture=neutral, PublicK ...
- zookeeper分布式安装
1.先把zookeeper-3.5.2-alpha.tar上传解压到/usr/local/下重命名为zookeeper ############# zookeeper env ############ ...
- centos时区
执行:cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime是将shanghai时区设置为系统时区 执行:date +%s 获取的是系统的utc时间戳 ...
- PHP文件操作功能函数大全
PHP文件操作功能函数大全 <?php /* 转换字节大小 */ function transByte($size){ $arr=array("B","KB&quo ...
- android系统的源代码获取(亲测可用)
1.在线阅读各版本源代码: http://androidxref.com/ 2.下载到本地: http://blog.csdn.net/yin1031468524/article/details/55 ...
- 甩掉DataList,Repeater,列表数据显示得灵活--转
在WebForm 显示列表数据我们一般使用服务器控件Repeater.DataList或者GridView ,功强大能,使用简单.但同时也是有代价的, 一:不管你用哪个控件都需要牺牲一些额外的性能,因 ...
- C# web 总结
(1)Cshtml 中 “@” 符号转义 在 cshtml 中需要使用 “@” 符号,如 “@幸福摩天轮版权所有”.那么我们需要使用转义,使用 “@@” 就好!“© ”和 “@” 好像呀. <t ...
- html扩展调用qq邮箱
总体流程:qq邮箱->设置->账户->邮我(使用邮我) over!over!over!