…差不多写了3个小时吧。。。。
嘛其实没什么思维,主要是一些套路的结合。。。
但是还是有一定的编写难度的(5.7k)可想而知
#include<bits/stdc++.h>
#define MAXN 100005
using namespace std;
int n,m;
int a[MAXN * 4],l1[MAXN * 4],l2[MAXN * 4];
int x,y,k;
struct node{
int lx,rx,mx;
}t1[MAXN * 4] , t2[MAXN * 4];
void update1(int rt , int l , int r){//ά»¤Ò»¶Î1µÄ×£¬
int mid = (l + r) >> 1;
t1[rt].lx = t1[rt << 1].lx;
if(a[rt << 1] == mid - l + 1)t1[rt].lx = t1[rt << 1].lx + t1[(rt << 1) | 1].lx;
t1[rt].rx = t1[(rt << 1) | 1].rx;
if(a[(rt << 1) | 1] == r - mid)t1[rt].rx = t1[(rt << 1) | 1].rx + t1[rt << 1].rx;
t1[rt].mx = max(t1[rt << 1].mx , t1[(rt << 1) | 1].mx);
t1[rt].mx = max(t1[rt].mx , t1[rt << 1].rx + t1[(rt << 1) | 1].lx);
}
void update2(int rt , int l , int r){//ά»¤Ò»¶Î1µÄ×£¬
int mid = (l + r) >> 1;
t2[rt].lx = t2[rt << 1].lx;
if(t2[rt << 1].lx == mid - l + 1)t2[rt].lx = t2[rt << 1].lx + t2[(rt << 1) | 1].lx;
t2[rt].rx = t2[(rt << 1) | 1].rx;
if(t2[(rt << 1) | 1].rx == r - mid)t2[rt].rx = t2[(rt << 1) | 1].rx + t2[rt << 1].rx;
t2[rt].mx = max(t2[rt << 1].mx , t2[(rt << 1) | 1].mx);
t2[rt].mx = max(t2[rt].mx , t2[rt << 1].rx + t2[(rt << 1) | 1].lx);
}
void build(int rt , int l , int r){
l1[rt] = -1;
l2[rt] = 0;
if(l == r){
cin>>a[rt];
if(a[rt] == 0)t2[rt].lx = t2[rt].rx = t2[rt].mx = 1;
else t1[rt].lx = t1[rt].rx = t1[rt].mx = 1;
return;
}
int mid = (l + r) >> 1;
build(rt << 1 , l , mid);
build((rt << 1) | 1 , mid + 1 , r);
a[rt] = a[rt << 1] + a[(rt << 1) | 1];
update1(rt , l , r);
update2(rt , l , r);
return;
}
void push_down(int rt , int l , int r){
int mid = (l + r) >> 1;
if(l1[rt] == (-1) && l2[rt] == 0)return;
else if(l1[rt] == (-1) && l2[rt] == 1){
a[rt << 1] = (mid - l + 1) - a[rt << 1] , a[(rt << 1) | 1] = (r - mid) - a[(rt << 1) | 1];
if(l1[rt << 1] != (-1))l1[rt << 1] = (l1[rt << 1] + 1) % 2;
else l2[rt << 1] = (l2[rt << 1] + 1) % 2;
if(l1[(rt << 1) | 1] != (-1))l1[(rt << 1) | 1] = (l1[(rt << 1) | 1] + 1) % 2;
else l2[(rt << 1) | 1] = (l2[(rt << 1) | 1] + 1) % 2;
swap(t1[rt << 1].mx , t2[rt << 1].mx);swap(t1[rt << 1].lx , t2[rt << 1].lx);swap(t1[rt << 1].rx , t2[rt << 1].rx);
swap(t1[(rt << 1) | 1].mx , t2[(rt << 1) | 1].mx);swap(t1[(rt << 1) | 1].lx , t2[(rt << 1) | 1].lx);swap(t1[(rt << 1) | 1].rx , t2[(rt << 1) | 1].rx);
}
else if(l1[rt] == 0){
a[rt << 1] = 0 , a[(rt << 1) | 1] = 0;
t1[rt << 1].lx = t1[(rt << 1) | 1].lx = t1[rt << 1].rx = t1[(rt << 1) | 1].rx = t1[rt << 1].mx = t1[(rt << 1) | 1].mx = 0;
t2[rt << 1].lx = t2[rt << 1].rx = t2[rt << 1].mx = mid - l + 1;
t2[(rt << 1) | 1].lx = t2[(rt << 1) | 1].rx = t2[(rt << 1) | 1].mx = r - mid;
l1[rt << 1] = l1[(rt << 1) | 1] = 0;
l2[rt << 1] = l2[(rt << 1) | 1] = 0;
}
else if(l1[rt] == 1){
a[rt << 1] = mid - l + 1 , a[(rt << 1) | 1] = r - mid;
t2[rt << 1].lx = t2[(rt << 1) | 1].lx = t2[rt << 1].rx = t2[(rt << 1) | 1].rx = t2[rt << 1].mx = t2[(rt << 1) | 1].mx = 0;
t1[rt << 1].lx = t1[rt << 1].rx = t1[rt << 1].mx = mid - l + 1;
t1[(rt << 1) | 1].lx = t1[(rt << 1) | 1].rx = t1[(rt << 1) | 1].mx = r - mid;
l1[rt << 1] = l1[(rt << 1) | 1] = 1;
l2[rt << 1] = l2[(rt << 1) | 1] = 0;
}
l1[rt] = -1;
l2[rt] = 0;
}
void add1(int rt , int l , int r){//°Ñx -- yÇø¼ä±äΪ0
if(r < x || l > y)return;
if(x <= l && r <= y){
a[rt] = l1[rt] = 0;
t1[rt].lx = t1[rt].rx = t1[rt].mx = 0;
t2[rt].lx = t2[rt].rx = t2[rt].mx = r - l + 1;
return;
}
push_down(rt , l , r);
int mid = (l + r) >> 1;
add1(rt << 1 , l , mid);
add1((rt << 1) | 1 , mid + 1 , r);
a[rt] = a[rt << 1] + a[(rt << 1) | 1];
update1(rt , l , r);
update2(rt , l , r);
return;
}
void add2(int rt , int l , int r){//°Ñx -- yÇø¼ä±äΪ1
if(r < x || l > y)return;
if(x <= l && r <= y){
a[rt] = r - l + 1;
t1[rt].lx = t1[rt].rx = t1[rt].mx = r - l + 1;
t2[rt].lx = t2[rt].rx = t2[rt].mx = 0;
l1[rt] = 1;
return;
}
push_down(rt , l , r);
int mid = (l + r) >> 1;
add2(rt << 1 , l , mid);
add2((rt << 1) | 1 , mid + 1 , r);
a[rt] = a[rt << 1] + a[(rt << 1) | 1];
update1(rt , l , r);
update2(rt , l , r);
return;
}
void add3(int rt , int l , int r){
if(r < x || l > y)return;
if(x <= l && r <= y){
a[rt] = (r - l + 1) - a[rt];
if(l1[rt] != (-1))l1[rt] = (l1[rt] + 1) % 2;
else l2[rt] = (l2[rt] + 1) % 2;
swap(t1[rt] , t2[rt]);
return;
}
push_down(rt , l , r);
int mid = (l + r) >> 1;
add3(rt << 1 , l , mid);
add3((rt << 1) | 1 , mid + 1 , r);
a[rt] = a[rt << 1] + a[(rt << 1) | 1];
update1(rt , l , r);
update2(rt , l , r);
return;
}
int que(int rt , int l , int r){
if(r < x || l > y)return 0;
if(x <= l && r <= y)return a[rt];
push_down(rt , l , r);
int mid = (l + r) >> 1 , zz = 0;
zz += que(rt << 1 , l , mid);
zz += que((rt << 1) | 1 , mid + 1 , r);
return zz;
}
node up(int rt , int l , int r){
if(r < x || l > y)return (node){0 , 0 , 0};
if(x <= l && r <= y)return t1[rt];
int mid = (l + r) >> 1 , zz = 0;
node ans1 , ans2 , ans3;
push_down(rt , l , r);
ans1 = up(rt << 1 , l , mid);
ans2 = up((rt << 1) | 1 , mid + 1 , r);
ans3.lx = ans1.lx;
if(ans1.lx == mid - l + 1)ans3.lx = mid - l + 1 + ans2.lx;
ans3.rx = ans2.rx;
if(ans2.rx == r - mid)ans3.rx = r - mid + ans1.rx;
ans3.mx = max(ans1.mx , ans2.mx);
ans3.mx = max(ans3.mx , ans1.rx + ans2.lx);
return ans3;
}
int main(){
cin>>n>>m;
build(1 , 1 , n);
for(int i = 1 ; i <= m ;i++){
cin>>k>>x>>y;
x++;
y++;
if(k == 0)add1(1 , 1 , n);
if(k == 1)add2(1 , 1 , n);
if(k == 2)add3(1 , 1 , n);
if(k == 3)cout<<que(1 , 1 , n)<<endl;
if(k == 4){
node ans = up(1 , 1, n);
cout<<max(ans.mx , max(ans.lx , ans.rx))<<endl;
}
x = 1 , y = n;
}
}