调了快一天了孩子要似了求调求调
样例能过,hack能过,0pts
10 10
1 0 0 1 0 1 1 1 0 1
2 0 4
2 9 9
1 5 7
2 3 8
4 5 9
0 4 8
2 0 3
1 0 1
4 5 6
3 1 2
这组怎么都过不了
ans:
1
0
1
out:
1
2
1
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int a[100005];
struct ST
{
int l,r;
int cnt0,cnt1,pre0,pre1,suf0,suf1,ans0,ans1;
ST operator+(const ST &bb) const
{
ST res;
res.l=l;
res.r=bb.r;
res.cnt0=cnt0+bb.cnt0;
res.cnt1=cnt1+bb.cnt1;
if(cnt0==0) res.pre1=cnt1+bb.pre1;
else res.pre1=pre1;
if(cnt1==0) res.pre0=cnt0+bb.pre0;
else res.pre0=pre0;
if(bb.cnt0==0) res.suf1=suf1+bb.cnt1;
else res.suf1=bb.suf1;
if(bb.cnt1==0) res.suf0=suf0+bb.cnt0;
else res.suf0=bb.suf0;
res.ans0=max({ans0,bb.ans0,suf0+bb.pre0});
res.ans1=max({ans1,bb.ans1,suf1+bb.pre1});
return res;
}
void set0()
{
*this={l,r,r-l+1,0,r-l+1,0,r-l+1,0,r-l+1,0};
}
void set1()
{
*this={l,r,0,r-l+1,0,r-l+1,0,r-l+1,0,r-l+1};
}
void inv()
{
swap(cnt0,cnt1);
swap(pre0,pre1);
swap(suf0,suf1);
swap(ans0,ans1);
}
}tr[400005];
int tag[400005][2];
void build(int k,int l,int r)
{
tag[k][0]=-1;
if(l==r)
{
if(a[l]) tr[k]={l,r,0,1,0,1,0,1,0,1};
else tr[k]={l,r,1,0,1,0,1,0,1,0};
return;
}
int mid=(l+r)>>1;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
tr[k]=tr[k*2]+tr[k*2+1];
}
void push_down(int k)
{
if(tag[k][0]==0)
{
tag[k*2][0]=0;
tag[k*2+1][0]=0;
tag[k*2][1]=0;
tag[k*2+1][1]=0;
tr[k*2].set0();
tr[k*2+1].set0();
}
if(tag[k][0]==1)
{
tag[k*2][0]=1;
tag[k*2+1][0]=1;
tag[k*2][1]=0;
tag[k*2+1][1]=0;
tr[k*2].set1();
tr[k*2+1].set1();
}
if(tag[k][1]==1)
{
tag[k*2][1]^=1;
tag[k*2+1][1]^=1;
tr[k*2].inv();
tr[k*2+1].inv();
}
tag[k][0]=-1;
tag[k][1]=0;
}
void upd0(int k,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
tag[k][0]=0;
tr[k].set0();
return;
}
push_down(k);
int mid=(l+r)>>1;
if(x<=mid) upd0(k*2,l,mid,x,y);
if(y>mid) upd0(k*2+1,mid+1,r,x,y);
tr[k]=tr[k*2]+tr[k*2+1];
}
void upd1(int k,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
tag[k][0]=1;
tr[k].set1();
return;
}
push_down(k);
int mid=(l+r)>>1;
if(x<=mid) upd1(k*2,l,mid,x,y);
if(y>mid) upd1(k*2+1,mid+1,r,x,y);
tr[k]=tr[k*2]+tr[k*2+1];
}
void updinv(int k,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
tag[k][1]=1;
tr[k].inv();
return;
}
push_down(k);
int mid=(l+r)>>1;
if(x<=mid) updinv(k*2,l,mid,x,y);
if(y>mid) updinv(k*2+1,mid+1,r,x,y);
tr[k]=tr[k*2]+tr[k*2+1];
}
ST query(int k,int l,int r,int x,int y)
{
if(x<=l&&r<=y) return tr[k];
push_down(k);
int mid=(l+r)>>1;
ST res={l,r,0,0,0,0,0,0,0,0};
if(x<=mid) res=res+query(k*2,l,mid,x,y);
if(y>mid) res=res+query(k*2+1,mid+1,r,x,y);
return res;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
int op,l,r;
for(int i=1;i<=m;i++)
{
cin>>op>>l>>r;
l++,r++;
if(op==0) upd0(1,1,n,l,r);
if(op==1) upd1(1,1,n,l,r);
if(op==2) updinv(1,1,n,l,r);
if(op==3) cout<<query(1,1,n,l,r).cnt1<<endl;
if(op==4) cout<<query(1,1,n,l,r).ans1<<endl;
}
return 0;
}
/*
10 10
1 0 0 1 0 1 1 1 0 1
2 0 4
2 9 9
1 5 7
2 3 8
4 5 9
0 4 8
2 0 3
1 0 1
4 5 6
3 1 2
2 0 4 0 1 1 0 1 1 1 1 0 1
2 9 9 0 1 1 0 1 1 1 1 0 0
1 5 7 0 1 1 0 1 1 1 1 0 0
2 3 8 0 1 1 1 0 0 0 0 1 0
4 5 9 1
0 4 8 0 1 1 1 0 0 0 0 0 0
2 0 3 1 0 0 0 0 0 0 0 0 0
1 0 1 1 1 0 0 0 0 0 0 0 0
4 5 6 0
*/