题目链接: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. 3年前的一个小项目经验,分享给菜鸟兄弟们(公文收发小软件:小技能 SmallDatetime)...

    为什么80%的码农都做不了架构师?>>>   这个系统中的数据库有100多M,里面当然有很多表,我的每个表里,有几个字段,都是一样的例如 CreateUserID.CreateDat ...

  2. swift 3.0字符串的简单使用

    let str:String = "12314124" 获取某个指定位置的元素 print(str.characters[str.index(str.startIndex, off ...

  3. Java Web:jstl处理字符串

    用法:${fn:methodName(args....)} 在使用这些函数之前必须在JSP中引入标准函数的声明<%@ taglib prefix="fn" uri=" ...

  4. pod setup命令失败解决方法

    最近运行pod setup出现以下问题: remote: Compressing objects: 100% (34/34), done.error: RPC failed; curl 56 SSLR ...

  5. 图论--网络流--最小割 HDU 2485 Destroying the bus stations(最短路+限流建图)

    Problem Description Gabiluso is one of the greatest spies in his country. Now he's trying to complet ...

  6. CF1335E Three Blocks Palindrome

    就是我这个菜鸡,赛时写出了 E2 的做法,但是算错复杂度,导致以为自己的做法只能AC E1,就没交到 E2 上,然后赛后秒A..... 题意 定义一种字串为形如:\([\underbrace{a, a ...

  7. libevent(五)使用例子

    客户端: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/t ...

  8. NLP(二十九)一步一步,理解Self-Attention

      本文大部分内容翻译自Illustrated Self-Attention, Step-by-step guide to self-attention with illustrations and ...

  9. 能量项链(区间DP入门)

    题面:能量项链https://www.luogu.com.cn/problem/P1063 乍一看和石子合并差不多,可是多了头值和尾值,看起来十分麻烦 我们画一张图,紫色表示头值,蓝色表示尾值.规定西 ...

  10. 【Flink】使用之前,先简单了解一下Flink吧!

    目录 Flink简单介绍 概述 无边界数据流和有边界数据流 技术栈核心组成 架构体系 重要角色 Flink与Spark架构概念转换 Flink简单介绍 概述    在使用Flink之前,我们需要大概知 ...