题目链接: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. poj_1323 Game Prediction 贪心

    Game Prediction Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11814   Accepted: 5701 ...

  2. mysql 之 函数

    聚合函数 avg()函数 - 计算一组值或表达式的平均值. count()函数 - 计算表中的行数. instr()函数 - 返回子字符串在字符串中第一次出现的位置. sum()函数 - 计算一组值或 ...

  3. Ubuntu搭建NTP服务器

    NTP简介 NTP是Network Time Protocol的缩写,又称为网络时间协议.是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提 ...

  4. 记一次Pinpoint监控工具部署过程

    环境:Centos 7.4 X64IP:192.168.1.11 1.配置环境,先安装jdk 到Oracle官网下载安装JDK https://www.oracle.com/technetwork/j ...

  5. Crash日志解析

    当应用程序崩溃时,会创建一个崩溃报告,这对于了解导致崩溃的原因非常有用.本文档包含有关如何表示,理解和解释崩溃报告的基本信息. 1.介绍 2.获取崩溃和低内存报告 3.象征性的奔溃报告 1.位码(bi ...

  6. Docker docker-compose 配置lnmp开发环境

    1.安装docker yum -y install dockersystemctl start dockersystemctl enable docker 安装docker-compose https ...

  7. 开源 一套 Blazor Server 端精致套件

    Blazor 作为一种 Web 开发的新技术已经发展有一段时间了,有些人标称 无 JS 无 TS,我觉得有点误导新人的意味,也有人文章大肆宣传 Blazor 是 JavaScript 的终结者,是为了 ...

  8. 解决虚拟机中linux系统无法使用本机无线wifi联网的问题

    VMware Workstation 在嵌入式开发中经常会遇到,但是显示大多数人使用开发环境是Win10 + 无线网卡,针对这种情况,需要配置虚拟机的上网环境使用的是NAT模式,将配置过程进行描述: ...

  9. libevent(六)http server

    客户端: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <signa ...

  10. HashMap 底层探索

    其实HashMap就是一个Node数组,只是这个数组很奇怪它的每一个Node节点都有自己的下一个Node;这个是hashMap的Node的源码: static class Node<K,V> ...