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. Bellman—Ford算法思想

    ---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...

  2. JavaScript中:表达式和语句的区别

    JavaScript中:表达式和语句的区别 Javascript语言精粹:表达式是由运算符构成,并运算产生结果的语法结构.程序是由语句构成,语句则是由“:(分号)”分隔的句子或命令.如果在表达式后面加 ...

  3. 洛谷4245:【模板】任意模数NTT——题解

    https://www.luogu.org/problemnew/show/P4245 给两个多项式,求其乘积,每个系数对p取模. 参考: 代码与部分理解参考https://www.luogu.org ...

  4. Windows系统中Xshell与Linux连接时遇到的问题

    前提条件:在Windows系统中已经安装了Xshell,并且安装了虚拟机软件和Linux系统 步骤1.在Linux系统中root用户下,使用ifconfig命令查看虚拟系统Linux的IP地址.如图1 ...

  5. JSP页面中的Meta标签详解

    Meta标签详解 相信大家在平时开发中最常接触的页面就是html和jsp了,可在这两个页面中有一个Meta标签你天天都会看见,可是你真的了解这个标签的一些其他用处吗?今天给大家介绍一些该标签的其他应用 ...

  6. Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals)A模拟 B三分 C dfs D map

    A. Andryusha and Socks time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  7. jdbcType和javaType

    MyBatis 通过包含的jdbcType类型 BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINED TINYINT REAL VARCHAR BINARY BLOB NV ...

  8. javascript如何判断对象为空

    1.自定义jQuery的isEmptyObject()方法. function isEmptyObject(e) { var t; for (t in e) return !1; return !0 ...

  9. HashMap详谈以及实现原理

    (一).HashMap 基于哈希表的 Map 接口的实现 允许使用 null 值和 null 键 HashMap不是线程安全,想要线程安全,Collections类的静态方法synchronizedM ...

  10. 关于微信内置浏览器安卓端session丢失问题

    项目上线测试,发现微信安卓端存在用户登录无法验证session情况, 导致每次接口请求都无法识别,而苹果客户端不会出现此问题,非微信环境打开不会出现此问题,找到一些解决方案做下记录: 方案1: 由于微 ...