【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 ...
随机推荐
- NAT穿透(UDP打洞)
1.NAT(Network Address Translator)介绍 NAT有两大类,基本NAT和NAPT. 1.1.基本NAT 静态NAT:一个公网IP对应一个内部IP,一对一转换 动态NAT:N ...
- CF997B Roman Digits
题意翻译 给你一棵树,每次挑选这棵树的两个叶子,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少. 题目描述 You are given an unweighted ...
- 【题解】Atcoder ARC#83 E-Bichrome Tree
哈哈~自己做出来的E题!(虽然这题被机房大佬强D极水).最开始神经错乱,写了个完全不对的贪心,竟然只错了4个点(。•ˇ‸ˇ•。) 可以发现,一个节点的子树内部和他颜色相同的节点权值和 是固定的,那么不 ...
- POJ1204:Word Puzzles——题解
http://poj.org/problem?id=1204 题目大意:给一个字母表,求一些字符串的开端第一次出现的位置和字符串的方向(字符串可以按照八个方向放在字母表中可匹配的位置) ——————— ...
- 阿里云遇到的坑:CentOS7防火墙(Firewalld),你关了吗?
阿里云官方教程: https://help.aliyun.com/knowledge_detail/41317.html 百度参考的牛人教程(推荐): http://www.111cn.net/sys ...
- YBT 5.3 数位动态规划
记忆化搜索的专题 题解在代码中 Amount of Degrees[loj 10163] /* 此题可以转换成将10进制转成b进制后有k个1其他都为0的个数 所以用记忆化dfs dp[pos][sum ...
- 【BZOJ 4455】 [Zjoi2016]小星星 容斥计数
dalao教导我们,看到计数想容斥……卡常策略:枚举顺序.除去无效状态.(树结构) #include <cstdio> #include <cstring> #include ...
- 基于jquery的扩展写法
(function($){ $.fn.aa = function(canshu){ html = $(this).text(); alert(html) }})(jQuery); (function( ...
- linux配置虚拟机网络环境(老师要求的host-only)
我这个人就是懒,这TMD是全天下最坑爹的缺点了,当然爆粗口也是缺点,让我发泄一下吧.T^T 从n久之前,开了hadoop课的一天,我就想着要配置好,结果两次课连眼镜都忘了带,可想而知是什么陪我度过了那 ...
- group by多字段分组
在平时的开发任务中我们经常会用到MYSQL的GROUP BY分组, 用来获取数据表中以分组字段为依据的统计数据.比如有一个学生选课表,表结构如下: Table: Subject_Selection S ...