很早以前做过这题,早就没印象了,估计当时也是照着某大神的代码抄过的,现在是连题意都看了好长时间。

刚开始的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(集合的交并补,线段树)的更多相关文章

  1. c++ 求集合的交并补

    #include<iostream.h> #include<windows.h> #include<iomanip.h> #include<stdio.h&g ...

  2. java 集合交并补

    通过使用泛型方法和Set来表达数学中的表达式:集合的交并补.在下面三个方法中都将第一个參数Set复制了一份,并未直接改动參数中Set. package Set; import java.util.Ha ...

  3. 2019南昌网络赛-I(单调栈+线段树)

    题目链接:https://nanti.jisuanke.com/t/38228 题意:定义一段区间的值为该区间的和×该区间的最小值,求给定数组的最大的区间值. 思路:比赛时还不会线段树,和队友在这题上 ...

  4. bzoj4399 魔法少女LJJ 线段树合并+线段树二分+并查集

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4399 题解 毒瘤题 \(9\) 种操作还有支持动态图的连通性 仔细读题 $ c<=7$. ...

  5. poj 3225 Help with Intervals(线段树,区间更新)

    Help with Intervals Time Limit: 6000MS   Memory Limit: 131072K Total Submissions: 12474   Accepted:  ...

  6. 线段树(区间操作) 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 ...

  7. POJ 3225 Help with Intervals --线段树区间操作

    题意:给你一些区间操作,让你输出最后得出的区间. 解法:区间操作的经典题,借鉴了网上的倍增算法,每次将区间乘以2,然后根据区间开闭情况做微调,这样可以有效处理开闭区间问题. 线段树维护两个值: cov ...

  8. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  9. 培训补坑(day7:线段树的区间修改与运用)(day6是测试,测试题解以后补坑QAQ)

    补坑咯~ 今天围绕的是一个神奇的数据结构:线段树.(感觉叫做区间树也挺科学的.) 线段树,顾名思义就是用来查找一段区间内的最大值,最小值,区间和等等元素. 那么这个线段树有什么优势呢? 比如我们要多次 ...

随机推荐

  1. android中requestFocus

    标签用于指定屏幕内的焦点View. 例如我们点击tab键或enter键焦点自动进入下一个输入框用法: 将标签置于Views标签内部 <EditText id="@+id/text&qu ...

  2. numpy.argmax 用在求解混淆矩阵用

    numpy.argmax numpy.argmax(a, axis=None, out=None)[source] Returns the indices of the maximum values ...

  3. 矩阵管理——和visitor模式没有本质区别,都是为了避免资源重复

    矩阵管理中的员工是双线汇报的模式.其上司有两个,一个是流程上司,一个是专业上司.流程上司负责你的日常考核,专业上司负责你的晋升和任免. 管理条件 相对于矩阵管理的矩阵式组织,适合于某些较为庞大的全球性 ...

  4. wiki中文语料+word2vec (python3.5 windows win7)

    环境: win7+python3.5 1. 下载wiki中文分词语料   使用迅雷下载会快不少,大小为1个多G      https://dumps.wikimedia.org/zhwiki/late ...

  5. javascript之创建对象的方式

    1.object构造函数创建 var obj=new Object(); obj.name='xue'; 2.对象字面量创建 var obj={ name:'xue' } 3.构造函数创建 funct ...

  6. 移植最新版libmemcached到VC++的艰苦历程和经验总结(上)

    零.前言: 该篇博客的Title原计划是“在VC++中调用libmemcached的设计技巧”,可结果却事与原违,原因很简单,移植失败了.尽管结果如此,然而这3天的付出却是非常值得的,原因也很简单,收 ...

  7. hdu 3507 Print Article —— 斜率优化DP

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3507 设 f[i],则 f[i] = f[j] + (s[i]-s[j])*(s[i]-s[j]) + m ...

  8. HDU1711(KMP入门题)

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. python逼格提升

    1.合并可以匹配的条件 s1 = 7 if s1 > 5 and s1 < 10: print(s1) s1 = 7 if 5 < s1 < 10: print(s1) 2.i ...

  10. div显示2列

    #wdjContainer{ border:1px solid green; margin:10px auto; width:500px; height:300px; line-height:30px ...