POJ3225
题目链接: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的更多相关文章
- 线段树 poj3225
U:把区间[l,r]覆盖成1I:把[-∞,l)(r,∞]覆盖成0 D:把区间[l,r]覆盖成0C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换S:[l,r]区间0/1互换 因 ...
- poj3225 线段树区间操作 (见鬼)
细节处理实在太重要了. #include<cstdio> #include<cstring> #define MT 65533*4 #define Maxn MT*4 int ...
- poj3225(线段树区间更新&hash)
题目链接: http://poj.org/problem?id=3225 题意: 初始给一个全局为 0~65536 的区间 s, 然后不断地对区间 s 进行 并, 交, 差, 相对差等运算, 输出最 ...
- 【poj3225】Help with Intervals
Time Limit: 6000MS Memory Limit: 131072K Total Submissions: 12084 Accepted: 3033 Case Time Limit ...
- [转载]完全版线段树 by notonlysuccess大牛
原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...
- 【转】线段树完全版~by NotOnlySuccess
线段树完全版 ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...
- 《完全版线段树》——notonlysuccess
转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...
- 【转】 线段树完全版 ~by NotOnlySuccess
载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章 ...
- 【转载】完全版线段树 by notonlysuccess大牛
原文出处:http://www.notonlysuccess.com/ 今晚上比赛就考到了 排兵布阵啊,难受. [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时 ...
随机推荐
- Linux系统管理第五六七章 权限及归属管理 磁盘管理 文件系统与lvm
第五六七章 alias 查看系统别名 67 chmod 设置文件或目录的权限 -R表示以递归的方式设置目录及目录下的所有子目录及文件的权限 u:属主 g:属组 o:其他人 a:所有人 +:添加 ...
- Flex 布局教程:语法篇(转自阮一峰的网络日志)
作者:阮一峰(转自阮一峰的网络日志,如有侵权,立即删除) 网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 ...
- nginx响应超时upstream timed out 问题处理
环境介绍 服务器:centos7.2 应用:tomcat集群 服务:nginx 代理 问题描述: 这段时间,听项目组项目经理和业务需求人员跟我反馈,线上业务人员在操作业务交易时,有时会出现nginx错 ...
- 关于利用注射点判断数据库web是否分离
得到客户端主机名:select host_name();得到服务端主机名: select @@servername; 本文转hackfreer51CTO博客,原文链接:http://blog.51ct ...
- 对MobileNet网络结构的解读
引言 近几年来,CNN在ImageNet竞赛的表现越来越好.为了追求分类准确度,模型越来越深,复杂度越来越高,如深度残差网络(ResNet)其层数已经多达152层.但是在真实场景中如移动或者嵌入式设备 ...
- D. Ehab the Xorcist(纯构造方法)
\(如果觉得下面难以理解,可以去这里看一种较为简单的解法\):saf \(这个题嘛,首先要明确异或的性质:相同为0,不同为1.\) \(举个例子,我们来构造u=15和v=127的情况\) \(注意到, ...
- CGI (通用网关接口)
CGI cgi即 Common Gateway Interface 译作 通用网关接口 是应用程序与应用程序之间的输入输出协议.比如我们写信,规定了开头一句写称呼,中间写内容,最后署名和日期.看到这种 ...
- 时间日期相关类:Date类,DateFormat类&SimpleDateFormat类,Calendar类
日期相关类 1.Date类:日期时间类 A.构造方法 Date(): 根据当前系统时间创建日期对象 Date(Long time):根据传入的毫秒值时间创建日期对象 B.成员方法 Long get ...
- vue项目-打印页面中指定区域的内容(亲测有效!)
关于打印整个页面的,没什么好说的.今天我给大家分享一个打印指定区域的方法,你想打印哪里,就打印哪里! 我也是刚刚开始接触打印这一块功能的,然后当然是找度娘深入了解了一番啦,期间试了网上的各种方法,有的 ...
- 跨站点请求伪造(CSRF)总结和防御
什么是CRSF 构建一个地址,比如说是删除某个博客网站博客的链接,然后诱使已经登录过该网站的用户点击恶意链接,可能会导致用户通过自己的手将曾经发布在该网站的博客在不知情的情况下删除了.这种构建恶意链接 ...