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. POJ1269:Intersecting Lines——题解

    http://poj.org/problem?id=1269 题目大意:给四个点,求前两个点所构成的直线和后两个点所构成的直线的位置关系(平行,重合,相交),如果是相交,输出交点坐标. ——————— ...

  2. 51NOD 1594:Gcd and Phi——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1594 参考及详细推导:http://www.cnblogs.com/ri ...

  3. UVA.10881 Piotr's Ants (思维题)

    UVA.10881 Piotr's Ants (思维题) 题意分析 有一根长度为L cm的木棍,上有n只蚂蚁,蚂蚁要么向左爬,要么向右,速度均为1cm/s,若2只蚂蚁相撞,则蚂蚁同时调头.求解第T秒时 ...

  4. push与createElement性能比较

    下面的实验是验证push()函数与CreateElement()函数在创建HTML元素的效率.可以看出,实用push()确实效率要比后者要高,不过究竟可以高出多少,还需要有专研精神的朋友去测试了,这里 ...

  5. 微服务学习三:springboot与springcloud集成之Eurake的使用(server端,client端)

    这个多亏了网站上的一个大神的博客: http://blog.csdn.net/forezp/article/details/70148833 强烈推荐学习: 1.springcloud是什么,这个大家 ...

  6. HTMLajax跨域向服务器写入数据

    1.XMLHttpRequest升级版已经实现了跨域请求.不过需要在后台设置:header("Access-Control-Allow-Origin:http://www.a.com&quo ...

  7. Linux网络监控工具nethogs

    Linux网络监控工具nethogs 标签: 监控工具linux 2015-12-17 22:06 448人阅读 评论(0) 收藏 举报  分类: linux(40)  版权声明:本文为博主原创文章, ...

  8. Python爬虫学习笔记之微信宫格验证码的识别(存在问题)

    本节我们将介绍新浪微博宫格验证码的识别.微博宫格验证码是一种新型交互式验证码,每个宫格之间会有一条 指示连线,指示了应该的滑动轨迹.我们要按照滑动轨迹依次从起始宫格滑动到终止宫格,才可以完成验证,如 ...

  9. HDU 5901 Count primes 大素数计数

    题意:计算1~N间素数的个数(N<=1e11) 题解:题目要求很简单,作为论文题,模板有两种 \(O(n^\frac{3}{4} )\),另一种lehmer\(O(n^\frac{2}{3})\ ...

  10. python实现备份gitlab版本库并更改文件名

    脚本的功能是实现备份gitlab版本库,并修改备份后的文件名,成功后发送邮件至相关负责人,脚本如下: #!/usr/bin/env python # -*- coding:utf-8 -*- impo ...