BZOJ1858:[SCOI2010]序列操作——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1858
lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作:
0 a b 把[a, b]区间内的所有数全变成0
1 a b 把[a, b]区间内的所有数全变成1
2 a b 把[a,b]区间内的所有数全部取反,也就是说把所有的0变成1,把所有的1变成0
3 a b 询问[a, b]区间内总共有多少个1
4 a b 询问[a, b]区间内最多有多少个连续的1
对于每一种询问操作,lxhgww都需要给出回答,聪明的程序员们,你们能帮助他吗?
线段树嘛,很裸的,正好趁自己神志不清试着来写写吧。
woc这线段树真恶心,2个标记维护7个量!
显然需要维护区间1个数,区间最大连续1。
为了合并还需要维护区间左最大连续1和右最大连续1.
为了取反还需要把上述东西的0也给求出来。
之后你愉快的敲起了数组线段树,结果发现你4操作写起来贼费劲。
靠!改结构体!
然后就是两个标记纠缠不清的问题了。
于是过了三次拍,debug了三次,终于过了……
2h+考场直接gg。
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+;
const int p=1e9+;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct node{
int l,r,ls0,rs0,ls1,rs1;
int lz,sum,rng0,rng1;
bool rev;
}t[N*];
int n,m,b[N];
inline void upt(int a,int l,int r){
int mid=(l+r)>>,ls=a<<,rs=a<<|;
t[a].sum=t[ls].sum+t[rs].sum;
t[a].rng1=max(t[ls].rs1+t[rs].ls1,max(t[ls].rng1,t[rs].rng1));
t[a].rng0=max(t[ls].rs0+t[rs].ls0,max(t[ls].rng0,t[rs].rng0));
t[a].ls1=t[ls].ls1+(t[ls].ls1==mid-l+?t[rs].ls1:);
t[a].rs1=t[rs].rs1+(t[rs].rs1==r-mid?t[ls].rs1:);
t[a].ls0=t[ls].ls0+(t[ls].ls0==mid-l+?t[rs].ls0:);
t[a].rs0=t[rs].rs0+(t[rs].rs0==r-mid?t[ls].rs0:);
}
inline void turn(int a){
t[a].sum=t[a].r-t[a].l+-t[a].sum;
swap(t[a].ls1,t[a].ls0);
swap(t[a].rs1,t[a].rs0);
swap(t[a].rng1,t[a].rng0);
}
inline void change(int a,int w){
if(w){
t[a].ls1=t[a].rs1=t[a].sum=t[a].rng1=t[a].r-t[a].l+;
t[a].ls0=t[a].rs0=t[a].rng0=;
}
else{
t[a].ls0=t[a].rs0=t[a].rng0=t[a].r-t[a].l+;
t[a].ls1=t[a].rs1=t[a].sum=t[a].rng1=;
}
t[a].rev=;
}
inline void push(int a){
int ls=a<<,rs=a<<|;
if(t[a].lz!=-){
change(ls,t[a].lz);change(rs,t[a].lz);
t[ls].lz=t[rs].lz=t[a].lz;t[a].lz=-;
}
if(t[a].rev){
turn(ls);turn(rs);
t[ls].rev^=;t[rs].rev^=;t[a].rev=;
}
}
void build(int a,int l,int r){
t[a].lz=-;t[a].rev=;t[a].l=l;t[a].r=r;
if(l==r){
t[a].sum=b[l];
if(b[l])t[a].ls1=t[a].rs1=t[a].rng1=;
else t[a].ls0=t[a].rs0=t[a].rng0=;
return;
}
int mid=(l+r)>>;
build(a<<,l,mid);build(a<<|,mid+,r);
upt(a,l,r);
}
void modify(int a,int l,int r,int l1,int r1,int w){
if(r<l1||r1<l)return;
if(l1<=l&&r<=r1){
t[a].lz=w;change(a,w);
return;
}
push(a);
int mid=(l+r)>>;
modify(a<<,l,mid,l1,r1,w);
modify(a<<|,mid+,r,l1,r1,w);
upt(a,l,r);
}
void reverse(int a,int l,int r,int l1,int r1){
if(r<l1||r1<l)return;
if(l1<=l&&r<=r1){
t[a].rev^=;turn(a);
return;
}
push(a);
int mid=(l+r)>>;
reverse(a<<,l,mid,l1,r1);
reverse(a<<|,mid+,r,l1,r1);
upt(a,l,r);
}
int query_sum(int a,int l,int r,int l1,int r1){
if(r<l1||r1<l)return ;
if(l1<=l&&r<=r1)return t[a].sum;
push(a);
int mid=(l+r)>>;
return query_sum(a<<,l,mid,l1,r1)+
query_sum(a<<|,mid+,r,l1,r1);
}
node query_rng(int a,int l,int r,int l1,int r1){
if(l1==l&&r==r1)return t[a];
push(a);
int mid=(l+r)>>;
if(mid>=r1)return query_rng(a<<,l,mid,l1,r1);
else if(mid+<=l1)return query_rng(a<<|,mid+,r,l1,r1);
node lans=query_rng(a<<,l,mid,l1,mid);
node rans=query_rng(a<<|,mid+,r,mid+,r1);
node ans;
ans.l=lans.l;ans.r=rans.r;
ans.rng1=max(lans.rs1+rans.ls1,max(lans.rng1,rans.rng1));
ans.rng0=max(lans.rs0+rans.ls0,max(lans.rng0,rans.rng0));
ans.ls1=lans.ls1+(lans.ls1==mid-l+?rans.ls1:);
ans.rs1=rans.rs1+(rans.rs1==r-mid?lans.rs1:);
ans.ls0=lans.ls0+(lans.ls0==mid-l+?rans.ls0:);
ans.rs0=rans.rs0+(rans.rs0==r-mid?lans.rs0:);
return ans;
}
int main(){
n=read(),m=read();
for(int i=;i<=n;i++)b[i]=read();
build(,,n);
while(m--){
int op=read(),l=read()+,r=read()+;
if(op==)modify(,,n,l,r,);
if(op==)modify(,,n,l,r,);
if(op==)reverse(,,n,l,r);
if(op==)printf("%d\n",query_sum(,,n,l,r));
if(op==)printf("%d\n",query_rng(,,n,l,r).rng1);
}
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ1858:[SCOI2010]序列操作——题解的更多相关文章
- BZOJ1858[Scoi2010]序列操作 题解
题目大意: 有一个01序列,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0:1 a b 把[a, b]区间内的所有数全变成1:2 a b 把[a,b]区间 ...
- bzoj1858[Scoi2010]序列操作 线段树
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 3079 Solved: 1475[Submit][Statu ...
- BZOJ1858 [Scoi2010]序列操作(线段树)
题目链接 [Scoi2010]序列操作 考验代码能力的一道好题. 思想还是很简单的(直接上线段树),但是比较难写. #include <bits/stdc++.h> using names ...
- [BZOJ1858] [SCOI2010] 序列操作 解题报告 (线段树)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1858 Description lxhgww最近收到了一个01序列,序列里面包含了n个数, ...
- 【分块】bzoj1858 [Scoi2010]序列操作
分块 Or 线段树 分块的登峰造极之题 每块维护8个值: 包括左端点在内的最长1段: 包括右端点在内的最长1段: 该块内的最长1段: 该块内1的个数: 包括左端点在内的最长0段://这四个是因为可能有 ...
- bzoj1858: [Scoi2010]序列操作
lazy-tag线段树. #include<cstdio> #include<algorithm> #include<cstring> using namespac ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- [待码][BZOJ1858]SCOI2010序列操作 jzyzoj1655
待码的线段树.....太长了看上去不是很想写 [ 什么破理由啊摔,不要脸 ] 嗯先水几道再写
- bzoj1858 [Scoi2010]序列操作——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1858 线段树...调了一个上午...(后面带 // 的都是改出来的) lazy 标记的下放好 ...
随机推荐
- Wireshark对HTTPS数据的解密
本文来自网易云社区 之前有介绍<wireshark抓包分析--TCP/IP协议>,然后某天有人问我,示例里是HTTP的,如果是HTTPS,你可以抓包分析吗?基于好奇,我查阅了下相关资料,把 ...
- OSG-简单模型控制
本文转至http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html 作者写的比较好,再次收藏,希望更多的人可以看到这个文章 互联网是是一个相 ...
- Linux命令应用大词典-第2章 获取帮助
2.1 help:查看内部Shell命令帮助信息 2.2 man:显示在线手册页 2.3 manpath:查看和设置man手册页的查询路径 2.4 info:阅读info格式的文件 2.5 pinfo ...
- lesson 16 Mary had a little lamb
lesson 16 Mary had a little lamb a little + 可数 小的;+ 不可数 少量的 对于动物在幼时都有不同的称呼: calf 小牛 lamb 羊羔 piglet 小 ...
- Zookeeper与Eureka的区别
Zookeeper与Eureka的区别 想要了解Zk与eureka的区别首先要知道CAP定理 CAP定理 Mysql强一致性(数据唯一出处),设计数据库设计的三范式 (表必须有主键:表不能有重复的列: ...
- 牛客网暑期ACM多校训练营(第五场):F - take
链接:牛客网暑期ACM多校训练营(第五场):F - take 题意: Kanade有n个盒子,第i个盒子有p [i]概率有一个d [i]大小的钻石. 起初,Kanade有一颗0号钻石.她将从第1到第n ...
- c# html 导出excel
[CustomAuthorize] public FileResult ExportCustomerManagerVisitExcel(string dateType, string r ...
- JQuery常用函数方法全集
Attribute: $("p").addClass(css中定义的样式类型); 给某个元素添加样式 $("img").attr({src:"test ...
- “Hello world!”团队—文案+美工
★★★本次采访我们随机选取5位不同的潜在用户,随机选取地点进行了本次采访. (一)项目有关内容: 大家好,我们是Hello World团队.我们组目前正在开发一个飞机大战的小游戏大家应该在小时候都玩过 ...
- ava中普通代码块,构造代码块,静态代码块区别及示例
//执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 其中静态代码块只执行一次.构造代码块在每次创建对象是都会执行. 1 普通代码块 //普通代码块:在 ...