题目链接: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. 徐州I

    #include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;++i) #defi ...

  2. vue与众不同的学习方式,让她年薪200多万

    学习vue正确思路,是先学vue-cli,再学vue.js单文件引用的用法,这样会在极短时间内撤底撑握vue,如果先学vue.js单文件用法,再去学vue-cli4,可以说是重新学vue,,,,难处大 ...

  3. 【抓包工具】tcpdump

    tcpdump - dump traffic on a network 根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析.它支 ...

  4. postman的使用概览

    本文主要描述postman的功能与使用方法Postman是404大厂的基于javascript语言完成的一款超级强大的插件,名字也很亲近(邮递员).可以用于做API请求测试.前端后台测试使用Postm ...

  5. 两种方法直接删除数组中特定值的项(JavaScript)

    一.问题详情: 直接删除意为原数组需要被改变,而不是得到另一个数组. 二.JavaScript实现 (一)巧用数组的push( ).shift( )方法 function del(arr,num) { ...

  6. PHP版DES算法加密数据(3DES)另附openssl_encrypt版本

    PHP版DES算法加密数据(3DES) 可与java的DES(DESede/CBC/PKCS5Padding)加密方式兼容 <?php /** * Created by PhpStorm. * ...

  7. inotify-tools的inotifywait工具用exclude 和 fromfile 排除指定后缀文件

    今天打算使用 inotify-tool 来对线上程序文件进行监控, 因为有些目录是缓存目录, 所以要进行排除, 同时还要排除一些指定的后缀的文件, 比如 .swp 等 需要递归监控的目录为: /tmp ...

  8. 一句话教你分清楚UML组合聚合和联系!

    组合:组合后的实体消失,则所有构成实体的部件都无意义,可以理解为不能独立存在 定义: 与聚合相比,组合描述的是这样的关联关系,部分离开整体后就没有实际意义了.所以我们说组合是一种很强的关联关系. 例子 ...

  9. 图论--2-SAT--HDU/HDOJ 4115 Eliminate the Conflict

    Problem Description Conflicts are everywhere in the world, from the young to the elderly, from famil ...

  10. 疯子的算法总结10--最小生成树Kruscal

    按照权值排序可得,就有如下顺序: 1. 1-2 1 2. 1-4 2 3. 1-5 2 4. 2-5 3 5. 2-3 4 6. 4-5 4 每次选取最小边泉,判断是否同属一个集合,如果不属于同一集合 ...