线段树

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]序列操作的更多相关文章

  1. 洛谷 P2572 [SCOI2010]序列操作

    题意简述 维护一个序列,支持如下操作 把[a, b]区间内的所有数全变成0 把[a, b]区间内的所有数全变成1 把[a,b]区间内所有的0变成1,所有的1变成0 询问[a, b]区间内总共有多少个1 ...

  2. 洛谷$P2572\ [SCOI2010]$ 序列操作 线段树/珂朵莉树

    正解:线段树/珂朵莉树 解题报告: 传送门$w$ 本来是想写线段树的,,,然后神仙$tt$跟我港可以用珂朵莉所以决定顺便学下珂朵莉趴$QwQ$ 还是先写线段树做法$QwQ$? 操作一二三四都很$eas ...

  3. 洛谷P2572 [SCOI2010]序列操作(ODT)

    题解 题意 题目链接 Sol ODT板子题..... // luogu-judger-enable-o2 #include<bits/stdc++.h> #define LL long l ...

  4. 洛谷P2572 [SCOI2010]序列操作(珂朵莉树)

    传送门 珂朵莉树是个吼东西啊 这题线段树代码4k起步……珂朵莉树只要2k…… 虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的…… 然而能过就行对不对…… (不过要是到时候noip我还真不敢打… ...

  5. 【题解】Luogu P2572 [SCOI2010]序列操作

    原题传送门:P2572 [SCOI2010]序列操作 这题好弱智啊 裸的珂朵莉树 前置芝士:珂朵莉树 窝博客里对珂朵莉树的介绍 没什么好说的自己看看吧 操作1:把区间内所有数推平成0,珂朵莉树基本操作 ...

  6. P2572 [SCOI2010]序列操作

    对自己 & \(RNG\) : 骄兵必败 \(lpl\)加油! P2572 [SCOI2010]序列操作 题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要 ...

  7. Luogu P2572 [SCOI2010]序列操作 线段树。。

    咕咕了...于是借鉴了小粉兔的做法ORZ... 其实就是维护最大子段和的线段树,但上面又多了一些操作....QWQ 维护8个信息:1/0的个数(sum),左/右边起1/0的最长长度(ls,rs),整段 ...

  8. bzoj 1858: [Scoi2010]序列操作

    1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MB 线段树,对于每个区间需要分别维护左右和中间的1和0连续个数,并在op=4时特殊 ...

  9. BZOJ 1858: [Scoi2010]序列操作( 线段树 )

    略恶心的线段树...不过只要弄清楚了AC应该不难.... ---------------------------------------------------------------- #inclu ...

随机推荐

  1. C语言博客作业—结构体

    一.PTA实验作业 题目1:结构体数组按总分排序 1. 本题PTA提交列表 2. 设计思路 void calc //函数calc求出p指针所指的结构体数组中 n 名学生各自的总分 { 定义循环变量i: ...

  2. C语言实现Linux命令——od

    C语言实现Linux命令--od 实现要求: 复习c文件处理内容 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 main与其他分开,制作静态库和动态库 编写M ...

  3. 设计模式NO.1

    设计模式NO.1 根据作业要求完成下列题目: 题目1: (1)要求:某系统日志记录器要求支持多种日志记录方式,如文件记录.数据库记录等:用户可以根据要求动态选择日志记录方式.使用Factory模式来设 ...

  4. android 框架LoonAndroid,码农偷懒专用

    介绍 http://www.eoeandroid.com/thread-324764-1-1.html 架构培训视频: http://pan.baidu.com/s/1mgv8HTm 简介:下载 ht ...

  5. python全栈开发-Day13 内置函数

    一.内置函数 注意:内置函数id()可以返回一个对象的身份,返回值为整数. 这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以 ...

  6. web信息泄露注意事项

    1. 确保您的Web服务器不发送显示有关后端技术类型或版本信息的响应头. 2. 确保服务器打开的端口上运行的所有服务都不会显示有关其构建和版本的信息. 3. 确保所有目录的访问权限正确,保证不会让攻击 ...

  7. windows安装虚拟主机virtualbox遇到的困难

    本来想到可以在windows安装虚拟主机virtualbox,但是怎么自己的windows是盗版的,由于主题已经被破解了,所以不能安装结果强制性的进入pe然后从网上下载的dll文件复制到 c/wind ...

  8. python __str__ 和__repr__方法

    看下面的例子就明白了 class Test(object): def __init__(self, value='hello, world!'): self.data = value >> ...

  9. php 数组对象之间的转换

    在之前我写过php返回json数据简单实例 从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码. 一.json_encode() 1 ...

  10. Java 高级开发必修知识---反射

    Class类的使用 1) 在面向对象的世界里,万事万物皆对象 A. Java语言中,普通数据类型,静态成员不是对象,其他皆对象 B. 每一个类也是对象 C. 类是java.lang.Class类的实例 ...