传送门1
传送门2
思路:
水题
我这里就把情况列出来好了
U->T区间覆盖1
I->T两边覆盖0
D->T区间覆盖0
C->T区间取反,两边覆盖0
S->T区间取反
把一个数x拆成3个点
分别表示小于x,等于x,大于x
然后线段树做上面这些操作就可以了
最后把标记都传下来,判断覆盖的线段即可
我觉得这题最难的是读入……
代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#define M 65540
using namespace std;
int m,n;
int tr[M*12],lazy[M*12];
bool cover[M*12],a[M*3];
char opt[10];
char get()
{char ch=getchar();while (ch!='['&&ch!=']'&&ch!='('&&ch!=')'&&ch!='U'&&ch!='I'&&ch!='D'&&ch!='C'&&ch!='S')ch=getchar();return ch;
}
void pushdown(int rt,int begin,int end)
{int mid=begin+end>>1;if (lazy[rt]!=-1){if (lazy[rt])tr[rt<<1]=mid-begin+1,tr[rt<<1|1]=end-mid,lazy[rt<<1]=lazy[rt<<1|1]=1;elsetr[rt<<1]=tr[rt<<1|1]=0,lazy[rt<<1]=lazy[rt<<1|1]=0;lazy[rt]=-1;cover[rt<<1]=cover[rt<<1|1]=cover[rt]=0;}else if (cover[rt]){cover[rt]=0;cover[rt<<1]^=1;cover[rt<<1|1]^=1;tr[rt<<1]=mid-begin+1-tr[rt<<1];tr[rt<<1|1]=end-mid-tr[rt<<1|1];if (lazy[rt<<1]!=-1) lazy[rt<<1]^=1;if (lazy[rt<<1|1]!=-1) lazy[rt<<1|1]^=1;}
}
void update(int rt,int begin,int end,int l,int r,int val)
{if (l<=begin&&end<=r){if (val) tr[rt]=end-begin+1;else tr[rt]=0;lazy[rt]=val;cover[rt]=0;return;}pushdown(rt,begin,end);int mid=begin+end>>1;if (mid>=l) update(rt<<1,begin,mid,l,r,val);if (mid<r) update(rt<<1|1,mid+1,end,l,r,val);tr[rt]=tr[rt<<1]+tr[rt<<1|1];
}
void invert(int rt,int begin,int end,int l,int r)
{if (l<=begin&&end<=r){tr[rt]=end-begin+1-tr[rt];if (lazy[rt]!=-1) lazy[rt]^=1;cover[rt]^=1;return;}pushdown(rt,begin,end);int mid=begin+end>>1;if (mid>=l) invert(rt<<1,begin,mid,l,r);if (mid<r) invert(rt<<1|1,mid+1,end,l,r);tr[rt]=tr[rt<<1]+tr[rt<<1|1];
}
void Down(int rt,int begin,int end)
{if (begin==end) return void(a[end]=tr[rt]);int mid=begin+end>>1;pushdown(rt,begin,end);Down(rt<<1,begin,mid);Down(rt<<1|1,mid+1,end);
}
void print(int x,int y)
{if (x%3==2) putchar('[');else putchar('(');printf("%d,%d",(x+2)/3-1,(y+2)/3-1);if (y%3==2) putchar(']');else putchar(')');putchar(' ');
}
main()
{int x,y;char l,r;n=M*3-3;memset(lazy,-1,sizeof(lazy));for (;scanf("%s",opt)!=EOF;){l=get();scanf("%d%c%d",&x,&r,&y);++x;++y;r=get();x=3*x-(l=='[');y=3*y-1-(r==')');if (opt[0]=='U')update(1,0,n,x,y,1);else if (opt[0]=='I')update(1,0,n,0,x-1,0),update(1,0,n,y+1,n,0);else if (opt[0]=='D')update(1,0,n,x,y,0);else if (opt[0]=='C')update(1,0,n,0,x-1,0),update(1,0,n,y+1,n,0),invert(1,0,n,x,y);elseinvert(1,0,n,x,y);}Down(1,0,n);x=0,y=0;if (!tr[1]) return 0&(puts("empty set"));for (int i=1;i<=n;++i)if (a[i]&&!x)x=i;else if (!a[i]&&x)y=i-1,print(x,y),x=0;
}

【BZOJ3226】【codevs2297】校门外的区间,线段树相关推荐

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

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

  2. Bzoj 3226: [Sdoi2008]校门外的区间

    以下来自 ShallWe's Blog 3226: [Sdoi2008]校门外的区间 Description 受校门外的树这道经典问题的启发,A君根据基本的离散数学的知识,抽象出5种运算维护集合\(S ...

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

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

  4. 51NOD 1631 小鲨鱼在51nod小学 区间线段树

    1631 小鲨鱼在51nod小学 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 鲨鱼巨巨2.0(以下简称小鲨鱼)以优异的成绩考入了51nod小学.并依 ...

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

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

  6. 牛客 - 骚区间(线段树+思维)

    题目链接:点击查看 题目大意:给出一个 1 ~ n 的排列 a ,现在规定骚区间当且仅当 a[ l ] 是 [ l , r ] 这段区间内的次小值,同时 a[ r ] 是 [ l , r ] 这段区间 ...

  7. 等差区间 线段树+GCD

    Description 已知一个长度为 nn 的数组 a[1],a[2],-,a[n]a[1],a[2],-,a[n],我们进行 qq 次询问,每次询问区间 a[l],a[l+1],-,a[r−1], ...

  8. BZOJ4653: [Noi2016]区间(线段树 双指针)

    题意 题目链接 Sol 按照dls的说法,一般这一类的题有两种思路,一种是枚举一个点\(M\),然后check它能否成为答案.但是对于此题来说好像不好搞 另一种思路是枚举最小的区间长度是多少,这样我们 ...

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

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

最新文章

  1. Hololens2-OpenXR开发(一)-入门
  2. Android库so文件及skia函数的调用
  3. bnu 34986 Football on Table(数学+暴力)
  4. python怎么写csv文件_python怎么写csv文件
  5. 哈佛经济学教授卧底贫民窟8年,揭开穷人最大真相:这比贫穷更可怕
  6. html5的canvas动画,Canvas HTML5简介 · Canvas动画教程
  7. 离散元pfc、3dec 专题
  8. 用python来开发webgame服务端(5)
  9. 如何确立人生目标?100个人生目标清单总汇
  10. java怪兽仙境攻略_《怪兽仙境》v1.20基础攻略
  11. 对往届软件工程的思考——写在软件工程开课之际 by 姜健
  12. 基于Matlab的DSB调制解调,课程设计(论文)-基于MATLAB的DSB调制与解调分析.doc
  13. 宝塔面板建立的网站为什么访问不了
  14. Html Table 样式
  15. VC中三种常见中文内码的转换方法(GB2312/GBK/BIG5)
  16. 基于.Net TcpListener 实现 WebSocketServer 通讯
  17. Java并发深度总结:synchronized 关键字
  18. 小学数学加减法测试软件,儿童数学练习智能出题系统
  19. 用java制作一个简易抽签器
  20. java语言程序设计 郎波 下载_郎波.Java语言程序设计[M].北京:清华大学出版社,2005:60....

热门文章

  1. 【DevCloud · 敏捷智库】Scrum和看板如何选择
  2. 【我的物联网成长记3】如何开发物联网应用?
  3. Python使用psutil模块,做你的电脑管家
  4. 【Python3网络爬虫开发实战】1.7.2-mitmproxy的安装
  5. java mysql 常见框架_Java岗面试重点:Java+JVM+MySQL+框架+算法,金九银十涨薪全靠它...
  6. 红橙Darren视频笔记 ViewGroup事件分发分析 基于API27
  7. Android笔记 fragment入门 动态加载fragment demo+ 判断横竖屏
  8. 2021-06-20 pip有时候需要加上--user安装才好使
  9. Catalan数表达式完整推导
  10. 识别图片噪声干扰_射频相位噪声介绍