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】维护序列的更多相关文章

  1. BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 5504  Solved: 1937[Submit ...

  2. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

  3. bzoj 维护序列seq(双标记线段树)

    Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 4184  Solved: 1518[Submit][Status][Discus ...

  4. BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )

    线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...

  5. 1798: [Ahoi2009]Seq 维护序列seq

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 2930  Solved: 1087[Submit ...

  6. BZOJ_1798_[AHOI2009]维护序列_线段树

    BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...

  7. Letters Removing CodeForces - 899F (线段树维护序列)

    大意: 给定字符串, 每次删除一段区间的某种字符, 最后输出序列. 类似于splay维护序列. 每次删除都会影响到后面字符的位置 可以通过转化为查询前缀和=k来查找下标. #include <i ...

  8. bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 7773  Solved: 2792[Submit ...

  9. bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

  10. [Luogu 2023] AHOI2009 维护序列

    [Luogu 2023] AHOI2009 维护序列 恕我冒昧这和线段树模板二有个琴梨区别? #include <cstdio> int n,m; long long p; class S ...

随机推荐

  1. linux 服务器丢包故障排查

    项目开了个P2P服务器,但是运行一段时间就会出现丢包问题,具体表现为:1.udp丢包严重(一分钟收发分别1.5W) 2.ssh(用于运维指令)连接不上该服务器(超时) 3.服务器运行好像没什么异常,u ...

  2. DFS染色解决区域分块问题UVALive 6663

    怪我比赛的时候想法太过于杂乱了. 注重于区域的属性了.甚至还想用状态压缩或者是hash来描述分块的区域. 其实我们的可以宏观的角度去审视这个问题.就是求分区的问题.那么我们完全可以标记边框的值为1.即 ...

  3. hdu ACM Steps Section 1 花式A+B 输入输出格式

    acm与oi很大的一个不同就是在输入格式上.oi往往是单组数据,而acm往往是多组数据,而且题目对数据格式往往各有要求,这8道a+b(吐槽..)涉及到了大量的常用的输入输出格式.https://wen ...

  4. BZOJ4755: [JSOI2016]扭动的回文串——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4755 JYY有两个长度均为N的字符串A和B. 一个“扭动字符串S(i,j,k)由A中的第i个字符到 ...

  5. BZOJ4753:[JSOI2016]最佳团体——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4753 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号. ...

  6. 数组分组chunk的一种写法

    lodash的_.chunk函数可以将数组按照数量分成若干组, 例如: const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; const groupByN ...

  7. 【逆序对相关/数学】【P1966】【NOIP2013D1T2】 火柴排队

    传送门 Description 涵涵有两盒火柴,每盒装有 $n$ 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum ...

  8. Django CRM系统

    本节内容 业务痛点分析 项目需求讨论 使用场景分析 表结构设计 业务痛点分析 我2013年刚加入老男孩教育的时候,学校就一间教室,2个招生老师,招了学生后,招生老师就在自己的excel表里记录一下,每 ...

  9. JavaScript数据类型转换方法汇总

    转换为布尔型 用两次非运算(!): 1 !!5 ==> true 用布尔型的构造函数: 1 new Boolean(5) == > true 值转换为布尔类型为false:0,+0,-0, ...

  10. 如何用好 github 中的 watch、star、fork

    http://www.jianshu.com/p/6c366b53ea41 https://www.zhihu.com/question/20431718 在每个 github 项目的右上角,都有三个 ...