题目链接:https://vjudge.net/problem/POJ-3225

解题思路:这道题要是不看题解以本渣新现在的实力确实是做不出来。
  以区间为基础建立线段树。
  当X=‘U', 将区间T内的线段上的数字都置为1;当X='I', 将区间T外面的数字置为0;当X=‘D‘,将区间T内的数字置为0;当X=‘C',将区间T外的数字置为0,区间T内的数字0/1倒置;当X=‘S',将区间T内的数字0/1倒置。这就是整道题的精髓所在。

  在AC代码中,lazy标记的使用值得细细品味,对于0/1倒置这种操作,如果对同一区间使用偶数次,那么就相当于没有操作,于是用lazy先给有这种操作的区间做好标记,用PushDown()函数保证在每次线段树更新到这个区间之前,0/1倒置的操作已经完成,lazy标志清0。PushDown()也算是一个重点吧,因为这个而WA了好几发。本来还有一个PushUp()函数的,但是对于这种类型的线段树,PushUp()其实有点行不通。

AC代码:

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=;
const int inf=;
int tree[maxn<<];
int lazy[maxn<<];
int ans[maxn+];
void PushDown(int rt){
if(tree[rt]!=-){
tree[rt<<|]=tree[rt<<]=tree[rt];
lazy[rt<<|]=lazy[rt<<]=;
}
if(lazy[rt]){
if(tree[rt<<]!=-)
tree[rt<<]^=;
else
lazy[rt<<]^=;
if(tree[rt<<|]!=-)
tree[rt<<|]^=;
else
lazy[rt<<|]^=;
lazy[rt]=;
}
tree[rt]=-;
}
void change(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
if(tree[rt]!=-)
tree[rt]^=;
else
lazy[rt]^=;
return;
}
if(l==r)
return;
PushDown(rt);
int m=(l+r)>>;
if(L<=m) change(L,R,l,m,rt<<);
if(R>m) change(L,R,m+,r,rt<<|);
}
void update(int L,int R,int c,int l,int r,int rt){
if(L<=l&&r<=R){
tree[rt]=c;
lazy[rt]=;
return;
}
if(l==r)
return;
PushDown(rt);
int m=(l+r)>>;
if(L<=m) update(L,R,c,l,m,rt<<);
if(R>m) update(L,R,c,m+,r,rt<<|);
}
void query(int l,int r,int rt){
if(tree[rt]==){
if(lazy[rt]){
tree[rt]=;
lazy[rt]=;
return;
}
for(int i=l;i<=r;i++){
ans[i]=tree[rt];
}
return;
}
if(tree[rt]==) return;
if(l==r){
return;
}
PushDown(rt);
int m=(l+r)>>;
query(l,m,rt<<);
query(m+,r,rt<<|);
}
int main(){
char in1[],in2[];
while(scanf("%s %s",in1,in2)==){
int x,y;
sscanf(&in2[],"%d",&x);
sscanf(strstr(in2,",")+,"%d",&y);
x=x*; y=y*;
if(in2[]=='(') x++;
if(strstr(in2,")")!=NULL) y--; if(x>y){
if(in1[]=='I'||in1[]=='C'){
lazy[]=tree[]=;
}
}
else{
if(in1[]=='U') update(x,y,,,inf,);
else if(in1[]=='I'){
update(,x-,,,inf,);
update(y+,inf,,,inf,);
}
else if(in1[]=='D')
update(x,y,,,inf,);
else if(in1[]=='C'){
change(x,y,,inf,);
update(,x-,,,inf,);
update(y+,inf,,,inf,);
}
else
change(x,y,,inf,);
}
}
query(,inf,);
int flag=;
int ind=;
for(int i=;i<=inf;i++){
if(!flag&&ans[i]){
if(ind)
printf(" ");
if(i%)
printf("(");
else
printf("[");
printf("%d,",i/);
ind++;
flag=;
}
else if(flag&&!ans[i]){
printf("%d",i/);
if((i-)%)
printf(")");
else
printf("]");
flag=;
}
}
if(!ind) printf("empty set");
printf("\n");
return ;
}

POJ3225的更多相关文章

  1. 线段树 poj3225

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

  2. poj3225 线段树区间操作 (见鬼)

    细节处理实在太重要了. #include<cstdio> #include<cstring> #define MT 65533*4 #define Maxn MT*4 int ...

  3. poj3225(线段树区间更新&hash)

    题目链接: http://poj.org/problem?id=3225 题意: 初始给一个全局为 0~65536 的区间  s, 然后不断地对区间 s 进行 并, 交, 差, 相对差等运算, 输出最 ...

  4. 【poj3225】Help with Intervals

    Time Limit: 6000MS   Memory Limit: 131072K Total Submissions: 12084   Accepted: 3033 Case Time Limit ...

  5. [转载]完全版线段树 by notonlysuccess大牛

    原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...

  6. 【转】线段树完全版~by NotOnlySuccess

    线段树完全版  ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...

  7. 《完全版线段树》——notonlysuccess

    转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...

  8. 【转】 线段树完全版 ~by NotOnlySuccess

    载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章 ...

  9. 【转载】完全版线段树 by notonlysuccess大牛

    原文出处:http://www.notonlysuccess.com/ 今晚上比赛就考到了 排兵布阵啊,难受. [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时 ...

随机推荐

  1. js 之 object

    js之object 对象 ECMA-262 把对象(object)定义为“属性的无序集合,每个属性存放一个原始值.对象或函数”.严格来说,这意味着对象是无特定顺序的值的数组. 尽管 ECMAScrip ...

  2. vue-cli3.0 gui初体验

    为什么80%的码农都做不了架构师?>>>   介绍 新版的vuecli3.0提供了一个vue ui这个命令,这个命令是做什么的呢,这里引用官网的一段介绍 vue ui 你可以通过 v ...

  3. 老男孩Linux运维50期 --于海科--决心书

    1.我叫于海科,来自于甘肃省天水市,之前就读于兰州石化职业技术学院,我是听之前的学长说老男孩教育出来就业不错,我特此来这培训希望出来能够找到一份不错的工作.2.五个月学完,目标薪资是11k.3.达到目 ...

  4. javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

    2019独角兽企业重金招聘Python工程师标准>>> 问题 前两天一个学弟在群里面问一个问题: 请问一下用阿里云服务器发送https请求为什么会失败,是需要有些其他什么配置吗? 同 ...

  5. 一只简单的网络爬虫(基于linux C/C++)————线程相关

    爬虫里面采用了多线程的方式处理多个任务,以便支持并发的处理,把主函数那边算一个线程的话,加上一个DNS解析的线程,以及我们可以设置的max_job_num值,最多使用了1+1+max_job_num个 ...

  6. Naigos install pnp4nagios 绘图插件

    原文地址:http://www.cnblogs.com/caoguo/p/5022230.html vim /etc/httpd/conf/httpd.conf <Directory " ...

  7. 1) drf 整体了解

    一.接口 """ 1.什么是接口:url+请求参数+响应数据 | 接口文档 ​ 2.接口规范: url:https,api,资源(名词复数),v1,get|post表示操 ...

  8. 使用docker搭建自己的博客(一)

    购买服务器 首先服务器选择腾讯云学生服务器,25岁以下实名认证后月租10块,还是很适合我这种简约派的 又财大气粗买了个一年的域名,后面涨价再说吧 安装docker 使用xshell连上服务器 安装必要 ...

  9. System类&StringBuilder类

    System类 1.currentTimeMillis()方法 作用:获取当前系统时间的毫秒值[注意:从现在到1970年1月1日 00:00:00] 2.arraycopy(...)方法 作用:复制数 ...

  10. PHP循环引用会遇到的坑

    今天遇到这样一个问题: 如果foreach循环一个数组,引用去对它的元素做一些操作,会有什么问题吗? 比如 [1, 2, 3],foreach循环的时候,引用给每个元素 * 2,再去foreach输出 ...