【SCOI2010】维护序列
NOI2017的简化版……
就是维护的时候要想清楚怎么讨论。
#include<bits/stdc++.h>
#define lson (o<<1)
#define rson (o<<1|1)
const int N=;
using namespace std;
int n,m;
int a[N];
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
struct Segment_Tree{
int sumv[N<<],rev[N<<],setv[N<<],maxl[N<<][],maxr[N<<][],maxv[N<<][];
inline void pushup(int o,int l,int r){
int mid=(l+r)>>;
maxl[o][]=maxl[lson][];
if(maxl[lson][]==mid-l+)maxl[o][]+=maxl[rson][];
maxr[o][]=maxr[rson][];
if(maxr[rson][]==r-mid)maxr[o][]+=maxr[lson][];
maxl[o][]=maxl[lson][];
if(maxl[lson][]==mid-l+)maxl[o][]+=maxl[rson][];
maxr[o][]=maxr[rson][];
if(maxr[rson][]==r-mid)maxr[o][]+=maxr[lson][];
maxv[o][]=max(maxv[lson][],max(maxv[rson][],maxr[lson][]+maxl[rson][]));
maxv[o][]=max(maxv[lson][],max(maxv[rson][],maxr[lson][]+maxl[rson][]));
sumv[o]=sumv[lson]+sumv[rson];
}
inline void pushdown(int o,int l,int r){
int mid=(l+r)>>;
if(setv[o]!=-){
int tag=setv[o];setv[lson]=setv[rson]=setv[o];
sumv[lson]=tag*(mid-l+);sumv[rson]=tag*(r-mid);
maxv[lson][tag]=maxl[lson][tag]=maxr[lson][tag]=mid-l+;
maxv[rson][tag]=maxl[rson][tag]=maxr[rson][tag]=r-mid;
maxv[lson][tag^]=maxl[lson][tag^]=maxr[lson][tag^]=;
maxv[rson][tag^]=maxl[rson][tag^]=maxr[rson][tag^]=;
setv[o]=-;rev[o]=;
}
if(rev[o]){
int lx=,rx=lx^;
rev[lson]^=;rev[rson]^=;
swap(maxv[lson][lx],maxv[lson][rx]);swap(maxv[rson][lx],maxv[rson][rx]);
swap(maxl[lson][lx],maxl[lson][rx]);swap(maxl[rson][lx],maxl[rson][rx]);
swap(maxr[lson][lx],maxr[lson][rx]);swap(maxr[rson][lx],maxr[rson][rx]);
sumv[lson]=mid-l+-sumv[lson];sumv[rson]=r-mid-sumv[rson];
if(setv[lson]!=-)setv[lson]^=;
if(setv[rson]!=-)setv[rson]^=;
rev[o]=;
}
}
inline void build(int o,int l,int r){
rev[o]=;setv[o]=-;
if(l==r){
sumv[o]=a[l];int lx=a[l],rx=lx^;
maxv[o][lx]=maxl[o][lx]=maxr[o][lx]=;
maxv[o][rx]=maxl[o][rx]=maxr[o][rx]=;
return;
}
int mid=(l+r)>>;
build(lson,l,mid);build(rson,mid+,r);
pushup(o,l,r);
}
inline void sett(int o,int l,int r,int ql,int qr,int v){
if(ql<=l&&r<=qr){int rx=v^;
sumv[o]=(r-l+)*v;setv[o]=v;maxv[o][v]=maxl[o][v]=maxr[o][v]=r-l+;
rev[o]=;maxv[o][rx]=maxl[o][rx]=maxr[o][rx]=;
return;
}
int mid=(l+r)>>;pushdown(o,l,r);
if(ql<=mid)sett(lson,l,mid,ql,qr,v);
if(qr>mid)sett(rson,mid+,r,ql,qr,v);
pushup(o,l,r);
}
inline void rever(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr){
rev[o]^=;swap(maxv[o][],maxv[o][]);swap(maxl[o][],maxl[o][]);swap(maxr[o][],maxr[o][]);
sumv[o]=(r-l+)-sumv[o];
if(setv[o]!=-)setv[o]^=;
return;
}
int mid=(l+r)>>;pushdown(o,l,r);
if(ql<=mid)rever(lson,l,mid,ql,qr);
if(qr>mid)rever(rson,mid+,r,ql,qr);
pushup(o,l,r);
}
inline int querysum(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return sumv[o];
int mid=(l+r)>>,ans=;
pushdown(o,l,r);
if(ql<=mid)ans+=querysum(lson,l,mid,ql,qr);
if(qr>mid)ans+=querysum(rson,mid+,r,ql,qr);
return ans;
}
inline int querymax(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return maxv[o][];
int mid=(l+r)>>;int ans=;
pushdown(o,l,r);
if(ql<=mid)ans=max(ans,querymax(lson,l,mid,ql,qr));
if(qr>mid)ans=max(ans,querymax(rson,mid+,r,ql,qr));
if(ql<=mid&&qr>mid)ans=max(ans,min(mid-ql+,maxr[lson][])+min(qr-mid,maxl[rson][]));
return ans;
}
}T;
int main(){
n=read();m=read();
for(int i=;i<=n;i++)a[i]=read();
T.build(,,n);
while(m--){
int opt=read(),l=read(),r=read();
l++;r++;
if(opt==)T.sett(,,n,l,r,);
if(opt==)T.sett(,,n,l,r,);
if(opt==)T.rever(,,n,l,r);
if(opt==)printf("%d\n",T.querysum(,,n,l,r));
if(opt==)printf("%d\n",T.querymax(,,n,l,r));
}
}
【SCOI2010】维护序列的更多相关文章
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- bzoj 维护序列seq(双标记线段树)
Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 4184 Solved: 1518[Submit][Status][Discus ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- 1798: [Ahoi2009]Seq 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 2930 Solved: 1087[Submit ...
- BZOJ_1798_[AHOI2009]维护序列_线段树
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
- Letters Removing CodeForces - 899F (线段树维护序列)
大意: 给定字符串, 每次删除一段区间的某种字符, 最后输出序列. 类似于splay维护序列. 每次删除都会影响到后面字符的位置 可以通过转化为查询前缀和=k来查找下标. #include <i ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[Submit ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- [Luogu 2023] AHOI2009 维护序列
[Luogu 2023] AHOI2009 维护序列 恕我冒昧这和线段树模板二有个琴梨区别? #include <cstdio> int n,m; long long p; class S ...
随机推荐
- 【bzoj2435】[NOI2011]道路修建 树形dp
题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. 每条道路的修 ...
- CF9d How many trees?
题意:求节点数为n的,高度大于等于h的二叉树的个数. 题解: 一开始没看到二叉树的限制,,,想了好久.因为数据范围很小,所以可以考虑一些很暴力的做法. 有2种DP方式都可以过. 1,f[i][j]表示 ...
- [SHOI2012]回家的路 最短路
---题面--- 题解: 吐槽:找了好久的错,换了n种方法,重构一次代码,,,, 最后发现,,, 数组开小了,其实一开始尝试开大了数组,但唯独没有尝试开大手写队列的数组.... 思路: 有两种方法,这 ...
- [Leetcode] maximun subarray 最大子数组
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
- JavaScript非阻塞加载脚本
As more and more sites evolve into “Web 2.0″ apps, the amount of JavaScript increases. This is a per ...
- Python Pandas与Numpy中axis参数的二义性
Stackoverflow.com是程序员的好去处,本公众号将以pandas为主题,开始一个系列,争取做到每周一篇,翻译并帮助pandas学习者一起理解一些有代表性的案例.今天的主题就是Pandas与 ...
- VC对话框实现添加滚动条实现滚动效果
对话框滚动条及滚动效果实现,用的api主要有: ScrollWindow, SetScrollInfo, GetScrollInfo, SetWindowOrgEx.涉及的数据结构为SCROLLINF ...
- zabbix监控ipmi
@1.假设idrac已经启用,并且使用ipmitool能正确读取数据(本文后面详细描述如何配置) @2.第一节只涉及web配置 1.创建主机 configuration-->hosts--> ...
- HDU1254 bfs
推箱子 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- Redrain 通用菜单控件使用方法和说明(附源码和demo)
转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42889709 大概半年前我写过博客说明怎么改造duilib的原代Menu ...