标签:
线段树,维护七个值两个标记。
用结构体快了一倍……
#include<bits/stdc++.h>
#define N (1<<18)
#define M (l+r>>1)
#define P (k<<1)
#define S (k<<1|1)
#define K l,r,k
#define L l,M,P
#define R M+1,r,S
#define Z int l=0,int r=n-1,int k=1
using namespace std;
int n;
static struct{
int same,flip;
int sum,u[2],v[2],a[2];
}a[N];
template<int d>
void make_same(Z){
a[k].flip=0;
a[k].sum=(a[k].same=d)*(r-l+1);
a[k].u[d^1]=a[k].v[d^1]
=a[k].a[d^1]=0;
a[k].u[ d ]=a[k].v[ d ]
=a[k].a[ d ]=r-l+1;
}
void make_flip(int,int,int);
void (*operate[3])(int,int,int)={
make_same<0>,
make_same<1>,
make_flip
};
void make_flip(Z){
if(~a[k].same)
operate[a[k].same^1](K);
else{
a[k].flip^=1;
a[k].sum=r-l+1-a[k].sum;
swap(a[k].u[0],a[k].u[1]);
swap(a[k].v[0],a[k].v[1]);
swap(a[k].a[0],a[k].a[1]);
}
}
void push_down(Z){
if(~a[k].same){
operate[a[k].same](L);
operate[a[k].same](R);
a[k].same=-1;
}
if(a[k].flip){
operate[2](L);
operate[2](R);
a[k].flip=0;
}
}
void update(Z){
a[k].sum=a[P].sum+a[S].sum;
for(int i=0;i!=2;++i){
a[k].u[i]=a[P].u[i]
+a[S].u[i]*(a[P].u[i]==M-l+1);
a[k].v[i]=a[S].v[i]
+a[P].v[i]*(a[S].v[i]==r-M);
a[k].a[i]=max(max(
a[P].a[i],a[S].a[i]),
a[P].v[i]+a[S].u[i]);
}
}
template<int d>
void A(int s,int t,Z){
if(s==l&&t==r)
operate[d](K);
else{
push_down(K);
if(t<=M)
A<d>(s,t,L);
else if(s>M)
A<d>(s,t,R);
else{
A<d>(s,M,L);
A<d>(M+1,t,R);
}
update(K);
}
}
int Q1(int s,int t,Z){
if(s==l&&t==r)
return a[k].sum;
push_down(K);
return t<=M?Q1(s,t,L)
:s>M?Q1(s,t,R)
:Q1(s,M,L)+Q1(M+1,t,R);
}
int Q2(int s,int t,Z){
if(s==l&&t==r)
return a[k].a[1];
push_down(K);
return t<=M?Q2(s,t,L)
:s>M?Q2(s,t,R)
:max(max(Q2(s,M,L),
Q2(M+1,t,R)),
min(a[P].v[1],M-s+1)
+min(a[S].u[1],t-M));
}
void build(Z){
if(l==r){
scanf("%d",&a[k].sum);
operate[a[k].sum](K);
}else{
build(L);
build(R);
update(K);
a[k].same=-1;
}
}
int main(){
int m;
scanf("%d%d",&n,&m);
build();
while(m--){
int op,a,b;
scanf("%d%d%d",&op,&a,&b);
if(op==0)
A<0>(a,b);
if(op==1)
A<1>(a,b);
if(op==2)
A<2>(a,b);
if(op==3)
printf("%d\n",Q1(a,b));
if(op==4)
printf("%d\n",Q2(a,b));
}
}
标签:
原文地址:http://www.cnblogs.com/f321dd/p/5495960.html