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

刚开始的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. 简单实现php文件管理

    如何能够利用PHP语言来进行空间中的文件管理,为我们带来良好的空间布局呢?今天我们就为大家介绍一种简便的PHP文件管理的实现方法. PHP预定义变量数组种类概览 PHP uploaded_files函 ...

  2. hdu-4081 Qin Shi Huang's National Road System(最小生成树+bfs)

    题目链接: Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: ...

  3. vue.js created函数注意事项

    因为created钩子函数是页面一加载完就会调用的函数,所以如果你想在这个组件拿值或者是赋值,很可能this里面能拿到数据,但是如果你用this.赋值的话,控制台或者debugger都会发现this里 ...

  4. 安装tensorflow-gpu出现的问题

    1.Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/usr/local/l ...

  5. tabbar 设置样式

    app.json配置文件中,使用时需要把注释删除,配置文件不支持备注 tabbar:{ color:'#fff',//字体颜色  需要时HexColor,设置成red 无法识别,下方颜色设置同理 se ...

  6. NHibernate错误:Could not compile the mapping document的解决

    用动软代码生成器的NHibernate生成模板,生成一个“XML映射模板”,老是提示Could not compile the mapping document的问题. 各种的找,就是没找到问题. 后 ...

  7. js数组,在遍历中删除元素(用 for (var i in arr)是无效的 )

    /** * 有效的方式 - 改变下标,控制遍历 */ for (var i = 0; i < arr.length; i++) { if (...) { arr.splice(i, 1); // ...

  8. ubuntu--vim 技巧

    本文介绍了vi (vim)的基本使用方法,但对于普通用户来说基本上够了! vi编辑器是所有Unix及Linux系统下标准的编 辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法 ...

  9. Mina学习之---mina整体流程介绍

    现在公司使用的NIO框架一直时候Mina,当然这也的框架还有Netty.虽然一直在用,但只是简单的停留在业务层面,最近面试的时候有问Mina相关的东西.在之前的博客中已经对BIO,NIO,AIO这三种 ...

  10. 【Hadoop】HDFS笔记(二):HDFS的HA机制和Federation机制

    HA解决了HDFS的NameNode的单点问题: Federation解决了整个HDFS集群中只有一个名字空间,并且只有单独的一个NameNode管理所有DataNode的问题. 一.HA机制(Hig ...