洛谷P2572 [SCOI2010]序列操作
线段树
pushdown写的很浪~
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define MAXN 100000+10
using namespace std;
struct Node{
int L,R;
int tag;
int num[];
int lcon[],rcon[],mcon[];
Node(){
L=R=tag=;
num[]=num[]=;
lcon[]=rcon[]=mcon[]=;
lcon[]=rcon[]=mcon[]=;
}
}dat[MAXN<<];
int n,m;
int a[MAXN];
Node Merge(Node A,Node B){
if(A.L<)return B;
if(B.L<)return A;
Node ret;
ret.L=A.L,ret.R=B.R;
int ls=A.R-A.L,rs=B.R-B.L;
for(int i=;i<=;i++){
ret.num[i]=A.num[i]+B.num[i];
if(A.num[i]==ls)ret.lcon[i]=ls+B.lcon[i];
else ret.lcon[i]=A.lcon[i];
if(B.num[i]==rs)ret.rcon[i]=rs+A.rcon[i];
else ret.rcon[i]=B.rcon[i];
ret.mcon[i]=max(A.mcon[i],B.mcon[i]);
ret.mcon[i]=max(ret.mcon[i],A.rcon[i]+B.lcon[i]);
}
return ret;
}
void c(Node &A,int x){
x--;
int size=A.R-A.L;
A.num[x]=size,A.num[x^]=;
A.lcon[x]=A.rcon[x]=A.mcon[x]=size;
A.lcon[x^]=A.rcon[x^]=A.mcon[x^]=;
A.tag=x+;
}
void r(Node &A){
swap(A.num[],A.num[]);
swap(A.lcon[],A.lcon[]);
swap(A.rcon[],A.rcon[]);
swap(A.mcon[],A.mcon[]);
A.tag=;
}
void update(Node &A,int x){
if(x<=){c(A,x);return;}
if(!A.tag){
r(A);
}
else if(A.tag<=){
c(A,((A.tag-)^)+);
}
else{
r(A);
A.tag=;
}
}
void pushdown(int k){
if(!dat[k].tag)return;
update(dat[k<<],dat[k].tag);
update(dat[k<<|],dat[k].tag);
dat[k].tag=;
}
void build(int k,int L,int R){
if(L+==R){
dat[k].L=L,dat[k].R=R;
if(a[L]){dat[k].num[]=dat[k].lcon[]=dat[k].rcon[]=dat[k].mcon[]=;}
else {dat[k].num[]=dat[k].lcon[]=dat[k].rcon[]=dat[k].mcon[]=;}
return;
}
build(k<<,L,(L+R)>>);
build(k<<|,(L+R)>>,R);
dat[k]=Merge(dat[k<<],dat[k<<|]);
}
void rev(int a,int b,int k){
int L=dat[k].L,R=dat[k].R;
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
update(dat[k],);
}
else{
pushdown(k);
rev(a,b,k<<);
rev(a,b,k<<|);
dat[k]=Merge(dat[k<<],dat[k<<|]);
}
}
void cha(int a,int b,int k,int x){
int L=dat[k].L,R=dat[k].R;
if(b<=L||R<=a){
return;
}
else if(a<=L&&R<=b){
update(dat[k],x);
}
else{
pushdown(k);
cha(a,b,k<<,x);
cha(a,b,k<<|,x);
dat[k]=Merge(dat[k<<],dat[k<<|]);
}
}
Node query(int a,int b,int k){
int L=dat[k].L,R=dat[k].R;
if(b<=L||R<=a){
Node ret;ret.L=-;
return ret;
}
else if(a<=L&&R<=b){
return dat[k];
}
else{
pushdown(k);
Node lc=query(a,b,k<<);
Node rc=query(a,b,k<<|);
return Merge(lc,rc);
}
}
int main()
{
// freopen("data.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
build(,,n+);
int opt,x,y;
while(m--){
scanf("%d%d%d",&opt,&x,&y);x++,y++;
if(==opt||opt==){
cha(x,y+,,opt+);
}
else if(==opt){
rev(x,y+,);
}
else{
Node ans=query(x,y+,);
printf("%d\n",(==opt?ans.num[]:ans.mcon[]));
}
}
return ;
}
洛谷P2572 [SCOI2010]序列操作的更多相关文章
- 洛谷 P2572 [SCOI2010]序列操作
题意简述 维护一个序列,支持如下操作 把[a, b]区间内的所有数全变成0 把[a, b]区间内的所有数全变成1 把[a,b]区间内所有的0变成1,所有的1变成0 询问[a, b]区间内总共有多少个1 ...
- 洛谷$P2572\ [SCOI2010]$ 序列操作 线段树/珂朵莉树
正解:线段树/珂朵莉树 解题报告: 传送门$w$ 本来是想写线段树的,,,然后神仙$tt$跟我港可以用珂朵莉所以决定顺便学下珂朵莉趴$QwQ$ 还是先写线段树做法$QwQ$? 操作一二三四都很$eas ...
- 洛谷P2572 [SCOI2010]序列操作(ODT)
题解 题意 题目链接 Sol ODT板子题..... // luogu-judger-enable-o2 #include<bits/stdc++.h> #define LL long l ...
- 洛谷P2572 [SCOI2010]序列操作(珂朵莉树)
传送门 珂朵莉树是个吼东西啊 这题线段树代码4k起步……珂朵莉树只要2k…… 虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的…… 然而能过就行对不对…… (不过要是到时候noip我还真不敢打… ...
- 【题解】Luogu P2572 [SCOI2010]序列操作
原题传送门:P2572 [SCOI2010]序列操作 这题好弱智啊 裸的珂朵莉树 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 操作1:把区间内所有数推平成0,珂朵莉树基本操作 ...
- P2572 [SCOI2010]序列操作
对自己 & \(RNG\) : 骄兵必败 \(lpl\)加油! P2572 [SCOI2010]序列操作 题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要 ...
- Luogu P2572 [SCOI2010]序列操作 线段树。。
咕咕了...于是借鉴了小粉兔的做法ORZ... 其实就是维护最大子段和的线段树,但上面又多了一些操作....QWQ 维护8个信息:1/0的个数(sum),左/右边起1/0的最长长度(ls,rs),整段 ...
- bzoj 1858: [Scoi2010]序列操作
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...
- BZOJ 1858: [Scoi2010]序列操作( 线段树 )
略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...
随机推荐
- 学号:201621123032 《Java程序设计》第8周学习总结
1:本周学习总结 2:书面作业 2.1:ArrayList代码分析 2.1.1:解释ArrayList的contains源代码 Contains方法调用indexof方法,如果元素为null,则循环比 ...
- HTML5的新的结构元素介绍
HTML5的新的结构元素介绍 一.HTML5与HTML4的区别 1. 取消了一些过时的HTML4的标签 其中包括纯粹显示效果的标记,如<font>和<center>,它们已经被 ...
- string类的简洁版实现
说是原创,差不多算是转载了,我也是看了好多大牛的写法,大牛的建议,自己加一总结,形成代码: 实现一个简洁版的string类,我觉得,下面的也够了:另外需要参见另外的写法: http://blog.cs ...
- RAID 损坏后如何对物理硬盘做完整镜像
"磁盘阵列是由很多价格较便宜的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能.利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上." ...
- day-2 如何搭建一个github代码库
最近在听尤瓦尔·赫拉利代写的两本书<人类简史>和<未来简史>两本书评,一部描述人类从哪里来,一部描述人类将往哪里去,书中阐述以前我们经历的饥饿.疾病和战争已经渐渐逝去,未来我们 ...
- JAVA_SE基础——60.初识Object
java是面向对象的语言,核心思想:找适合 的对象做适合 的事情:方式一:自定义类,然后通过自定义的类创建对象.方式二:sun提供了很多的类给我使用,我们只需要认识这些类,我们就可以通过这些类创建对象 ...
- os.getcwd()、sys.path[0]、sys.argv[0]和__file__的区别,终于弄清楚了
os.getcwd().sys.path[0].sys.argv[0]和__file__的区别 要分清这几个的区别与使用条件,实际测试一下是最准确的. 设计测试方法: 一个主模块用来运行,一个子模块用 ...
- Mego开发文档 - 复杂查询
复杂查询 Mego 还支持一些更高级的LLINQ查询写法,本文只列出一部分. 分组汇总查询 using (var db = new OrderManageEntities()) { var query ...
- python之celery的使用(一)
前段时间需要使用rabbitmq做写缓存,一直使用pika+rabbitmq的组合,pika这个模块虽然可以很直观地操作rabbitmq,但是官方给的例子太简单,对其底层原理了解又不是很深,遇到很多坑 ...
- python tornado TCPserver异步协程实例
项目所用知识点 tornado socket tcpserver 协程 异步 tornado tcpserver源码抛析 在tornado的tcpserver文件中,实现了TCPServer这个类,他 ...