以下来自 ShallWe's Blog

3226: [Sdoi2008]校门外的区间

Description

  受校门外的树这道经典问题的启发,A君根据基本的离散数学的知识,抽象出5种运算维护集合\(S\)(\(S\)初始为空)并最终输出S。现在,请你完成这道校门外的树之难度增强版——校门外的区间。
  基本集合运算如下:
\(U:A∪B=\{x:x∈A|x∈B\}\)
\(I:A∩B=\{x:x∈A \& x∈B\}\)
\(D:A-B=\{x:x∈A \& x∉B\}\)
\(C:B-A\)
\(S:A⊕B=(A-B)∪(B-A)\)

Input

  输入共M行。
  每行的格式为X T,用一个空格隔开,X表示运算的种类,T为一个区间(区间用\((a,b)\),\((a,b]\),\([a,b)\),\([a,b]\)表示)。

Output

  共一行,即集合\(S\),每个区间后面带一个空格。若S为空则输出"empty set"。
对于\(100%\)的数据,\(0≤a≤b≤65535\),\(1≤M≤70000\)

解题报告

应该说是比较容易(by dada见友联)的一个题,首先,按照高中数学必修1所学的Vane图以及集合的基本运算,可以得到每一种对于区间进行的集合操作的效果:

  1. U: B区间->1
  2. I: 非B区间->0
  3. D:B区间->0
  4. C: 取反、转2
  5. S: 区间取反

请花vane图加深感受.
然后区间取反区间覆盖,当然可以使用线段树、平衡树(?),但是这两种标记在线段树中是不可合并的,但其实无所谓因为在询问的时候没有区间查询,而一旦出现要标记合并的地方,就提前下传,就像iwtwiioi说过“不能合并就传下去”,然后就没什么细节了,输入输出的过程中,将\(()\)作为\(*2+/-1\),\([]\)作为\(*2\)

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int N=131075;
int mark[N<<2],white[N<<2],rev[N<<2],m,n=131071;
char ch[10];
bool flag=0;
inline void in(int &x,int &y){char ch=getchar(); int tmp;for (;ch<'0'||ch>'9';ch=getchar()){if (ch=='(') x=1; if (ch=='[') x=0; }for (tmp=0;ch>='0'&&ch<='9';ch=getchar())tmp=tmp*10+ch-48;x+=tmp<<1;for (;ch<'0'||ch>'9';ch=getchar());for (tmp=0;ch>='0'&&ch<='9';ch=getchar())tmp=tmp*10+ch-48; for (;ch!=']'&&ch!=')';ch=getchar()); if (ch==']') y=0; else y=-1; y+=tmp<<1;
}
void build(int x,int l,int r){mark[x]=-1,white[x]=0; if (l==r) return; int mid=(l+r)>>1; build(x<<1,l,mid); build(x<<1|1,mid+1,r);
}
inline void down(int x,int l,int r){int m=mark[x],re=rev[x]; mark[x]=-1,rev[x]=0;if (l==r){if (m!=-1)white[x]=m;white[x]^=re;return;}if (m!=-1){mark[x<<1]=m;mark[x<<1|1]=m;rev[x<<1|1]=rev[x<<1]=0; }rev[x<<1]^=re,rev[x<<1|1]^=re;
}void add(int x,int l,int r,int L,int R,int val){down(x,l,r);    if (L<=l&&r<=R){if (val<2)mark[x]=val; elserev[x]^=1; return;}int mid=(l+r)>>1; if (L<=mid) add(x<<1,l,mid,L,R,val); if (R>mid) add(x<<1|1,mid+1,r,L,R,val);
}
int query(int x,int l,int r,int pur){down(x,l,r);if (l==r) return white[x]; int mid=(l+r)>>1; if (pur<=mid) return query(x<<1,l,mid,pur);else return query(x<<1|1,mid+1,r,pur);
}
inline void print(int x,int y){if (x&1) printf("(%d,",x>>1); else printf("[%d,",x>>1); if (y&1) printf("%d)",y+1>>1); else printf("%d]",y>>1);flag=1;printf(" ");
}
int main(){
//  freopen("interval.in","r",stdin);
//  freopen("interval.out","w",stdout);build(1,0,n);int a,b;while (scanf("%s",ch)!=EOF){in(a,b);if (ch[0]=='U') add(1,0,n,a,b,1);if (ch[0]=='I'){if(a)add(1,0,n,0,a-1,0);add(1,0,n,b+1,n,0);}if (ch[0]=='D') add(1,0,n,a,b,0);if (ch[0]=='C'){ add(1,0,n,1,a-1,0);add(1,0,n,a,b,2);add(1,0,n,b+1,n,0);}if (ch[0]=='S') add(1,0,n,a,b,2);}int s=-1,t=0;for (t=0;t<=n;t++)if (!query(1,0,n,t)){if (s!=-1) print(s,t-1),s=-1; }elseif (s==-1) s=t;if (s!=-1) print(s,n),s=-1; if (!flag) printf("empty set");return 0;
}

转载于:https://www.cnblogs.com/ShallWe2000/p/5773604.html

Bzoj 3226: [Sdoi2008]校门外的区间相关推荐

  1. P5568 [SDOI2008]校门外的区间(离散数学应用+线段树+开闭区间处理)(校门三部曲)难度⭐⭐⭐⭐

    校门三部曲,总算完结了!完结散花! 难度呈阶梯状,都可以用线段树解决. 第一部 P1047 校门外的树(线段树优化)难度⭐⭐ 第二部 P1276 校门外的树(增强版)(线段树)校门三部曲难度⭐⭐⭐ 第 ...

  2. 「BZOJ3226」[Sdoi2008]校门外的区间

    题目 首先是开闭区间的处理,我们把\(1.5\)这种数加进来,用\([1.5,6]\)来表示\((2,6]\) 根据离散数学的基本知识,尝试把五个操作转化成人话 把\([x,y]\)变成\(1\) 把 ...

  3. [bzoj 3226]校门外的区间

    题意 输出最后的集合 题解 校门外的树会做吧 区间知道是什么东西吧 校门外的区间会做了吧 昨天做个大线段树没做出来,今天做个小线段树压压惊 py一下输入数据,然后操作变成: U 区间涂1 I 两侧区间 ...

  4. 【BZOJ3226】【codevs2297】校门外的区间,线段树

    传送门1 传送门2 思路: 水题 我这里就把情况列出来好了 U->T区间覆盖1 I->T两边覆盖0 D->T区间覆盖0 C->T区间取反,两边覆盖0 S->T区间取反 把 ...

  5. 2017.5.12 校门外的区间 思考记录

    这题很裸,只要维护单点1,0就行了.. 不同运算表示  : u  : 全1 d  : 全0 i  : 以外全0 c  : 取反,以外取0 s  :取反 线段树标记记得下传时当前点标记清零 ,然后就没了 ...

  6. P1276 校门外的树(增强版)(线段树)(校门三部曲)难度⭐⭐⭐

    校门三部曲,总算完结了!完结散花! 难度呈阶梯状,都可以用线段树解决. 第一部 P1047 校门外的树(线段树优化)难度⭐⭐ 第二部 P1276 校门外的树(增强版)(线段树)校门三部曲难度⭐⭐⭐ 第 ...

  7. P1047 校门外的树(线段树优化)(校门三部曲)难度⭐⭐

    校门三部曲,总算完结了!完结散花! 难度呈阶梯状,都可以用线段树解决. 第一部 P1047 校门外的树(线段树优化)难度⭐⭐ 第二部 P1276 校门外的树(增强版)(线段树)校门三部曲难度⭐⭐⭐ 第 ...

  8. 校门外的树——树状数组+区间修改

    校门外的树 [题目分析]题目描述的是一种区间修改,看起来好像要用线段树.但是对于这种区间内部没有差别并且查询的是区间内的类别的问题,是可以转化为树状数组进行的.毕竟树状数组更加简单. 我们的关注点应该 ...

  9. vijos 1448 校门外的树 树状数组

    描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的-- 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K=1,读入l. ...

最新文章

  1. @芥末的糖----------《管理系统后台架构逻辑》
  2. centos8安装KVM/QEUM虚拟化
  3. 干货!神经网络原来是这样和数学挂钩的
  4. 使用好的工程实践交付可交付产品
  5. 给PHPSTORM添加XDEBUG调试功能
  6. Windows Server 2008网络基础结构的实现与管理
  7. Robot Framework--08 List Variables-List变量及其用法
  8. Behavior Language Processing with Graph based Feature Generation for Fraud DetectioninOnline Lending
  9. NetBios 的结构体详解(网络控制块NCB)
  10. vue自学入门-2(vue创建项目)
  11. 【译】R包介绍:Online Random Forest
  12. python操作windows窗口获取窗口句柄
  13. Pr全套视频教程 PR 全套零基础从入门到精通视频教程
  14. Hibernate的4种继承关系
  15. python 转义字符——学习笔记
  16. ES6.x版本单机三节点配置discovery.zen.ping.unicast.hosts 错误
  17. 贝塞尔曲线-曲线拟合
  18. python学习实验报告(第一周)
  19. hivesql失败告警发送到企业微信
  20. ubuntu 18.04 开启rc.local

热门文章

  1. CSNN: An Augmented Spiking based Framework with Perceptron-Inception
  2. The tempotron: a neuron that learns spike timing–based decisions 事件驱动
  3. quartz.net隔一天执行一次_母乳喂养多久喂一次最好?过度喂养危害大
  4. 产品报价单模板_外贸干货 | 外贸人的好东西,报价单这样做才专业!
  5. 【docker】安装教程
  6. 用python爬虫爬微博_利用python爬取微博热搜
  7. Eureke服务入门就这一篇就够了
  8. java mysql 连接测试_java连接mysql数据库及测试是否连接成功的方法
  9. python request和urllib_requests和urllib.request的区别是什么?
  10. 纽约poi数据集_数据福利|微软城市计算、AI for Earth