U:把区间[l,r]覆盖成1
I:把[-∞,l)(r,∞]覆盖成0    
D:把区间[l,r]覆盖成0
C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换
S:[l,r]区间0/1互换

因为普通的线段树实际处理的并非真正的区间,而是一系列点,相当于处理一个向量。这个问题需要处理的是真正的区间,所以应该有一个主导思想就是,把区间点化!不知哪位大牛搞了一个倍增区间出来,实在佩服!对于待处理区间[a,b](暂时不考虑开闭),对其边界均乘2。若区间左开则对左界值+1,若区间右开,则对右界-1!

如:[2,3]会倍增为[4,6],[2,3)会倍增为[4,5],(2,3]会倍增为[5,6],(2,3)将倍增为[5,5],我们这时可以看到,对于普通线段树无法处理的线段如(x,x+1)将被点化为[2*x+1,2*x+1]!这个问题得到比较完美的解决

最后把查找出来的区间逆向倍增操作一下,就可以得到实际的区间以及起开闭情况!

#include<stdio.h>
#include<algorithm>
#include<string.h> using namespace std; #define MAXN1 65545<<1
#define MAXN 65535<<1 int x[MAXN<<],col[MAXN<<]; void FXOR(int a)
{
if(x[a]!=-)
x[a]^=;
else
col[a]^=;
}
void push_down(int a)
{
if(x[a]!=-)
{
x[a<<]=x[a<<|]=x[a];
col[a<<]=col[a<<|]=;
x[a]=-;
}
if(col[a])
{
FXOR(a<<);
FXOR(a<<|);
col[a]=;
}
} void update(char val,int l,int r,int a1,int b1,int a)
{
if(l>=a1&&b1>=r)
{
if(val=='U')
{
x[a]=;
col[a]=;
}
else if(val=='D')
{
x[a]=;
col[a]=;
}
else if(val=='S'||val=='C')
FXOR(a);
return ;
}
push_down(a);
int mid=(l+r)>>;
if(a1<=mid)
update(val,l,mid,a1,b1,a<<);
else if(val=='I'||val=='C')
x[a<<]=col[a<<]=;
if(b1>mid)
update(val,mid+,r,a1,b1,a<<|);
else if(val=='I'||val=='C')
x[a<<|]=col[a<<|]=;
}
bool vis[MAXN1];
void Query(int l,int r,int a)
{
if(x[a]==)
{
for(int i=l;i<=r;i++)
vis[i]=;
return ;
}
else if(x[a]==)
return ;
if(l==r)
return ;
push_down(a);
int mid=(l+r)>>;
Query(l,mid,a<<);
Query(mid+,r,a<<|);
}
int main()
{
x[]=col[]=;
char a,a1,a2,b;
int l,r;
while(scanf("%c %c%d,%d%c%c",&a,&a1,&l,&r,&a2,&b)!=EOF)
{
l<<=;
r<<=;
if(a1=='(')
l++;
if(a2==')')
r--;
if(l>r)
continue;
update(a,,MAXN,l,r,);
}
Query(,MAXN,);
int s=-,e;
bool flag=;
for(int i=;i<=MAXN;i++)
{
if(vis[i])
{
if(s==-)
s=i;
e=i;
}
else
{
if(s!=-)
{
if(flag)printf(" ");
printf("%c%d,%d%c",s&?'(':'[',s>>,(e+)>>,e&?')':']');
s=-;
flag=;
}
}
}
if(!flag)
printf("empty set"); return ;
}

最新文章

  1. iOS-集成支付宝支付、微信支付简单总结
  2. 在chrome下的文本框sendkeys,提示element can&#39;t focus--解决方法
  3. Facebook is Hiring!
  4. [Nginx][HttpUpstreamModule]翻译负载均衡
  5. 中型企业的IT运维策略
  6. 学习js之类的使用
  7. PF_RING 总结
  8. struts2,hibernate,spring整合笔记(4)--struts与spring的整合
  9. Android——自定义Actionbar左侧覆盖不全的解决方案
  10. Chapter 2 Open Book——15
  11. 大白话Vue源码系列(04):生成render函数
  12. SQL Server 插入含有中文字符串出现乱码现象的解决办法
  13. python各种web框架对比
  14. 18.jwt加密
  15. Python内置类型(1)——真值测试
  16. Windows 10 Install rabbitmq-server-3.6.9
  17. 第1节 常用DOS(磁盘操作系统)命令
  18. element-UI表格从一列中,拿到当前行的index----scope
  19. 点斜杠 &amp; 如何查看linux程序安装位置 dpkg -L yyy
  20. Robot Framework 教程 (1) - 环境配置及简单网站兼容性测试

热门文章

  1. U3D中GameObject.Find无法找到元件
  2. jquery中取消和绑定hover事件的正确方式
  3. json格式的优点
  4. datepicker monthpicker
  5. [转]Spring JdbcTemplate 查询分页
  6. Android — Camera聚焦流程
  7. Handler 消息传递机制
  8. [转]关于Python中的yield
  9. 开源:ASP.NET MVC+EF6+Bootstrap开发框架
  10. 基于DDD的.NET开发框架 - ABP缓存Caching实现