【[SCOI2010]序列操作】
好颓啊,我竟然来写了一道恶心的板子
旁边的魏佬嘲讽我,还用欺负我
嘤嘤嘤
那就不膜魏佬了
嘤嘤嘤
这是一道无聊的板子
看到这些操作,我们看到这些操作就知道我们需要维护的东西了
首先那个最长的连续的\(1\),显然要维护一下左最长,右最长,还是区间最长
由于有非常恶心的取反操作,所以最长的连续\(0\)也需要顺带维护一下
之后就是推一下标记了
显然非常强制性的覆盖标记比取反标记的优先级要更高
没什么了
#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 100005
#define max(a,b) ((a)>(b)?(a):(b))
struct node
{
int t,ll,rr,dd;
};
int l[maxn<<2],r[maxn<<2],tag[2][maxn<<2],d[maxn<<2],ans[2][maxn<<2],lc[2][maxn<<2],rc[2][maxn<<2];
int n,m;
int a[maxn];
inline void pushup(int i)
{
d[i]=d[i<<1]+d[i<<1|1];
if(d[i<<1|1]==r[i<<1|1]-l[i<<1|1]+1) rc[1][i]=rc[1][i<<1|1]+rc[1][i<<1];
else rc[1][i]=rc[1][i<<1|1];
if(d[i<<1]==r[i<<1]-l[i<<1]+1) lc[1][i]=lc[1][i<<1]+lc[1][i<<1|1];
else lc[1][i]=lc[1][i<<1];
if(!d[i<<1|1]) rc[0][i]=rc[0][i<<1|1]+rc[0][i<<1];
else rc[0][i]=rc[0][i<<1|1];
if(!d[i<<1]) lc[0][i]=lc[0][i<<1]+lc[0][i<<1|1];
else lc[0][i]=lc[0][i<<1];
ans[0][i]=max(max(ans[0][i<<1],ans[0][i<<1|1]),rc[0][i<<1]+lc[0][i<<1|1]);
ans[1][i]=max(max(ans[1][i<<1],ans[1][i<<1|1]),rc[1][i<<1]+lc[1][i<<1|1]);
}
inline void pushdown(int i)
{
if(tag[0][i]!=-1)
{
tag[0][i<<1]=tag[0][i],tag[0][i<<1|1]=tag[0][i];
tag[1][i<<1]=tag[1][i<<1|1]=0;
d[i<<1]=(r[i<<1]-l[i<<1]+1)*tag[0][i],d[i<<1|1]=(r[i<<1|1]-l[i<<1|1]+1)*tag[0][i];
ans[tag[0][i]][i<<1]=r[i<<1]-l[i<<1]+1,ans[tag[0][i]][i<<1|1]=r[i<<1|1]-l[i<<1|1]+1;
lc[tag[0][i]][i<<1]=r[i<<1]-l[i<<1]+1,lc[tag[0][i]][i<<1|1]=r[i<<1|1]-l[i<<1|1]+1;
rc[tag[0][i]][i<<1]=r[i<<1]-l[i<<1]+1,rc[tag[0][i]][i<<1|1]=r[i<<1|1]-l[i<<1|1]+1;
ans[tag[0][i]^1][i<<1]=0,ans[tag[0][i]^1][i<<1|1]=0;
lc[tag[0][i]^1][i<<1]=0,lc[tag[0][i]^1][i<<1|1]=0;
rc[tag[0][i]^1][i<<1]=0,rc[tag[0][i]^1][i<<1|1]=0;
tag[0][i]=-1;
}
if(tag[1][i])
{
if(tag[0][i<<1]==-1) tag[1][i<<1]^=1;
else tag[0][i<<1]^=1;
if(tag[0][i<<1|1]==-1) tag[1][i<<1|1]^=1;
else tag[0][i<<1|1]^=1;
d[i<<1]=(r[i<<1]-l[i<<1]+1-d[i<<1]),d[i<<1|1]=(r[i<<1|1]-l[i<<1|1]+1-d[i<<1|1]);
std::swap(ans[0][i<<1],ans[1][i<<1]),std::swap(ans[0][i<<1|1],ans[1][i<<1|1]);
std::swap(lc[0][i<<1],lc[1][i<<1]),std::swap(lc[0][i<<1|1],lc[1][i<<1|1]);
std::swap(rc[0][i<<1],rc[1][i<<1]),std::swap(rc[0][i<<1|1],rc[1][i<<1|1]);
tag[1][i]=0;
}
}
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
void build(int x,int y,int i)
{
l[i]=x,r[i]=y,tag[0][i]=-1;
if(x==y)
{
d[i]=a[x];
lc[a[x]][i]=rc[a[x]][i]=1;
ans[a[x]][i]=1;
return;
}
int mid=x+y>>1;
build(x,mid,i<<1),build(mid+1,y,i<<1|1);
pushup(i);
}
void change_1(int x,int y,int i,int val)
{
if(x<=l[i]&&y>=r[i])
{
d[i]=val*(r[i]-l[i]+1);
tag[1][i]=0;
tag[0][i]=val;
rc[val][i]=lc[val][i]=(r[i]-l[i]+1);
ans[val][i]=(r[i]-l[i]+1);
rc[val^1][i]=lc[val^1][i]=ans[val^1][i]=0;
return;
}
pushdown(i);
int mid=l[i]+r[i]>>1;
if(y<=mid) change_1(x,y,i<<1,val);
else if(x>mid) change_1(x,y,i<<1|1,val);
else change_1(x,y,i<<1|1,val),change_1(x,y,i<<1,val);
pushup(i);
}
void change_2(int x,int y,int i)
{
if(x<=l[i]&&y>=r[i])
{
d[i]=(r[i]-l[i]+1-d[i]);
if(tag[0][i]!=-1) tag[0][i]^=1;
else tag[1][i]^=1;
std::swap(rc[0][i],rc[1][i]),std::swap(lc[0][i],lc[1][i]),std::swap(ans[0][i],ans[1][i]);
return;
}
pushdown(i);
int mid=l[i]+r[i]>>1;
if(y<=mid) change_2(x,y,i<<1);
else if(x>mid) change_2(x,y,i<<1|1);
else change_2(x,y,i<<1|1),change_2(x,y,i<<1);
pushup(i);
}
int query(int x,int y,int i)
{
if(x<=l[i]&&y>=r[i]) return d[i];
pushdown(i);
int mid=l[i]+r[i]>>1;
if(y<=mid) return query(x,y,i<<1);
if(x>mid) return query(x,y,i<<1|1);
return query(x,y,i<<1)+query(x,y,i<<1|1);
}
node ask(int x,int y,int i)
{
if(x<=l[i]&&y>=r[i]) return (node){ans[1][i],lc[1][i],rc[1][i],r[i]-l[i]+1};
pushdown(i);
int mid=l[i]+r[i]>>1;
if(y<=mid) return ask(x,y,i<<1);
if(x>mid) return ask(x,y,i<<1|1);
node L=ask(x,y,i<<1),R=ask(x,y,i<<1|1);
node now;
if(R.dd==R.rr) now.rr=R.rr+L.rr;
else now.rr=R.rr;
if(L.dd==L.ll) now.ll=L.ll+R.ll;
else now.ll=L.ll;
now.dd=L.dd+R.dd;
now.t=max(L.t,max(R.t,R.ll+L.rr));
return now;
}
int main()
{
n=read(),m=read();
for(re int i=1;i<=n;i++)
a[i]=read();
build(1,n,1);
int opt,x,y;
while(m--)
{
opt=read(),x=read()+1,y=read()+1;
if(opt==0) change_1(x,y,1,0);
if(opt==1) change_1(x,y,1,1);
if(opt==2) change_2(x,y,1);
if(opt==3) printf("%d\n",query(x,y,1));
if(opt==4) printf("%d\n",ask(x,y,1).t);
}
return 0;
}
【[SCOI2010]序列操作】的更多相关文章
- bzoj 1858: [Scoi2010]序列操作
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...
- BZOJ 1858: [Scoi2010]序列操作( 线段树 )
略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...
- bzoj1858[Scoi2010]序列操作 线段树
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 3079 Solved: 1475[Submit][Statu ...
- BZOJ_1858_[Scoi2010]序列操作_线段树
BZOJ_1858_[Scoi2010]序列操作_线段树 Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询 ...
- 【题解】Luogu P2572 [SCOI2010]序列操作
原题传送门:P2572 [SCOI2010]序列操作 这题好弱智啊 裸的珂朵莉树 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 操作1:把区间内所有数推平成0,珂朵莉树基本操作 ...
- P2572 [SCOI2010]序列操作
对自己 & \(RNG\) : 骄兵必败 \(lpl\)加油! P2572 [SCOI2010]序列操作 题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要 ...
- BZOJ1858 [Scoi2010]序列操作(线段树)
题目链接 [Scoi2010]序列操作 考验代码能力的一道好题. 思想还是很简单的(直接上线段树),但是比较难写. #include <bits/stdc++.h> using names ...
- (WAWAWAWAWAWA) BZOJ 1858: [Scoi2010]序列操作
二次联通门 : BZOJ 1858: [Scoi2010]序列操作 /* BZOJ 1858: [Scoi2010]序列操作 已经... 没有什么好怕的的了... 16K的代码... 调个MMP啊.. ...
- 1858: [Scoi2010]序列操作
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 3397 Solved: 1624 [Submit][Statu ...
- SCOI2010 序列操作
2421 序列操作 http://codevs.cn/problem/2421/ 2010年省队选拔赛四川 题目描述 Description lxhgww最近收到了一个01序列,序列里面包含了n个 ...
随机推荐
- C# 之正则表达式运用
C#正则验证大全 Regex.IsMatch()正则表达式验证 需要引入命名空间 using System.Text.RegularExpressions; #region 验证文本框输入为数字 ...
- 面向对象(基础oop)之初识继承
大家好,我叫李京阳,,很高兴认识大家,之所以我想开一个自己的博客,就是来把自己所了解的知识点通过自己的话写一下,希望被博客园的朋友们点评和一起讨论一下,也希望从博客园中多认识一些软件开发人员!现在我开 ...
- [javaSE] IO流(RandomAccessFile)
随机访问文件,可以看作一个大型的byte[]数组,不算是IO体系中的一员,内部封装了字节输入输出流,可以设置权限,可以调整指针的位置 获取RandomAccessFile对象,构造参数:String文 ...
- Class类文件结构简介
Java跨平台的基础 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(ByteCode)是构成平台无关性的基石,也是语言无关性的基础.Java虚拟机不和包括Java在内的任何语言绑定 ...
- oracle数据库的安装与连接关键点
一.window xp系统上安装Oracle Database 10G 解锁Scott.Hr账号并重置口令 远程连接数oracle数据库地址 二.在Mac系统上使用Navicat远程连接oracle数 ...
- SqlServer 2005升级至SqlServer 2008 解析Json 字符集问题
如果你数据库是通过sqlserver 2008以上版本创建的请绕过: 客户以前用的是sqlserver2005 创建的数据库.后来升级到 sqlserver 2008 . 有个业务用到了json查询 ...
- php格式化保留2位小数
<td align="center"><?php echo sprintf("%.2f",$v[r][red_bag_money]);?> ...
- jquery获取哪一个下拉框被选中
var val = $("select[name='type_irb'] option:selected").val();
- BZOJ3812: 主旋律
传送门 Sol 考虑容斥 强联通图反过来就是一些缩点后的 \(DAG\) 一个套路就是对出(入)度为 \(0\) 的点进行容斥 设 \(g_S,h_S\) 分别表示选了奇数个 \(0\) 入度和偶数个 ...
- Java学习笔记(2)----散列集/线性表/队列/集合/图(Set,List,Queue,Collection,Map)
1. Java集合框架中的所有实例类都实现了Cloneable和Seriablizable接口.所以,它们的实例都是可复制和可序列化的. 2. 规则集存储的是不重复的元素.若要在集合中存储重复的元素, ...