dist_22r @ 2024-07-15 20:58:33
rt
#include<bits/stdc++.h>
#define ll long long
#define INF 1e9+7
#define lt u*2,l,mid
#define rt u*2+1,mid+1,r
#define ls u*2
#define rs u*2+1
using namespace std;
const int N=1e5+5;
int n,m,t[4*N],tl[4*N][2],tr[4*N][2],mt[4*N][2];
int a[N],lazy[4*N],lazyf[4*N];
void push_up(int u,int l,int r)
{
t[u]=t[ls]+t[rs];
int mid=(l+r)/2;
if(t[ls]==mid-l+1)
{
tl[u][1]=mid-l+1+tl[rs][1];
}
else
{
tl[u][1]=tl[ls][1];
}
if(t[rs]==r-mid)
{
tr[u][1]=r-mid+tr[ls][1];
}
else
{
tr[u][1]=tr[rs][1];
}
mt[u][1]=max(tr[ls][1]+tl[rs][1],max(mt[ls][1],mt[rs][1]));
if(t[ls]==0)
{
tl[u][0]=mid-l+1+tl[rs][0];
}
else
{
tl[u][0]=tl[ls][0];
}
if(t[rs]==0)
{
tr[u][0]=r-mid+tr[ls][0];
}
else
{
tr[u][0]=tr[rs][0];
}
mt[u][0]=max(tr[ls][0]+tl[rs][0],max(mt[ls][0],mt[rs][0]));
}
void push_down(int u,int l,int r)
{
int mid=(l+r)/2;
if(lazy[u]!=-1)
{
lazy[ls]=lazy[u];
t[ls]=(mid-l+1)*lazy[u];
tl[ls][lazy[u]]=mid-l+1;
tr[ls][lazy[u]]=mid-l+1;
mt[ls][lazy[u]]=mid-l+1;
lazyf[ls]=0;
lazy[rs]=lazy[u];
t[rs]=(r-mid)*lazy[u];
tl[rs][lazy[u]]=r-mid;
tr[rs][lazy[u]]=r-mid;
mt[rs][lazy[u]]=r-mid;
lazyf[rs]=0;
lazy[u]=-1;
}
if(lazyf[u])
{
t[ls]=mid-l+1-t[ls];
swap(tl[ls][1],tl[ls][0]);
swap(tr[ls][1],tr[ls][0]);
swap(mt[ls][1],mt[ls][0]);
if(lazy[ls]!=-1)
{
lazy[ls]^=1;
}
lazyf[ls]^=1;
t[rs]=r-mid-t[rs];
swap(tl[rs][1],tl[rs][0]);
swap(tr[rs][1],tr[rs][0]);
swap(mt[rs][1],mt[rs][0]);
if(lazy[rs]!=-1)
{
lazy[rs]^=1;
}
lazyf[rs]^=1;
lazyf[u]=0;
}
}
void build(int u,int l,int r)
{
lazy[u]=-1;
if(l==r)
{
t[u]=a[l];
tl[u][a[l]]=1;
tr[u][a[l]]=1;
mt[u][a[l]]=1;
return ;
}
int mid=(l+r)/2;
build(lt);
build(rt);
push_up(u,l,r);
}
void update(int u,int l,int r,int a,int b,int k)
{
if(a<=l&&b>=r)
{
t[u]=(r-l+1)*k;
tl[u][k]=r-l+1;
tr[u][k]=r-l+1;
mt[u][k]=r-l+1;
lazy[u]=k;
lazyf[u]=0;
return ;
}
push_down(u,l,r);
int mid=(l+r)/2;
if(a<=mid)
{
update(lt,a,b,k);
}
if(b>mid)
{
update(rt,a,b,k);
}
push_up(u,l,r);
}
void updatef(int u,int l,int r,int a,int b)
{
if(a<=l&&b>=r)
{
t[u]=r-l+1-t[u];
swap(tl[u][1],tl[u][0]);
swap(tr[u][1],tr[u][0]);
swap(mt[u][1],mt[u][0]);
lazyf[u]^=1;
if(lazy[u]!=-1)
{
lazy[u]^=1;
}
return ;
}
push_down(u,l,r);
int mid=(l+r)/2;
if(a<=mid)
{
updatef(lt,a,b);
}
if(b>mid)
{
updatef(rt,a,b);
}
push_up(u,l,r);
}
int query1(int u,int l,int r,int a,int b)
{
if(a<=l&&b>=r)
{
return t[u];
}
push_down(u,l,r);
int mid=(l+r)/2;
int ans=0;
if(a<=mid)
{
ans+=query1(lt,a,b);
}
if(b>mid)
{
ans+=query1(rt,a,b);
}
return ans;
}
int query2(int u,int l,int r,int a,int b)
{
if(a==l&&b==r)
{
return mt[u][1];
}
push_down(u,l,r);
int mid=(l+r)/2;
if(b<=mid)
{
return query2(lt,a,b);
}
else if(a>mid)
{
return query2(rt,a,b);
}
else
{
return max(max(query2(lt,a,mid),query2(rt,mid+1,b)),min(tl[rs][1],b-mid)+min(tr[ls][1],mid-a+1));
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=m;i++)
{
int op,x,y;
cin>>op>>x>>y;
x++;
y++;
if(op==0)
{
update(1,1,n,x,y,0);
}
else if(op==1)
{
update(1,1,n,x,y,1);
}
else if(op==2)
{
updatef(1,1,n,x,y);
}
else if(op==3)
{
cout<<query1(1,1,n,x,y)<<endl;
}
else
{
cout<<query2(1,1,n,x,y)<<endl;
}
}
return 0;
}
by dist_22r @ 2024-07-15 20:59:02
@piantouqu
by piantouqu @ 2024-07-15 21:06:06
你@我干嘛 (调不出来)
by Guchenxi0971 @ 2024-07-15 21:27:03
@dist_22r 就是说,你
by dist_22r @ 2024-07-15 21:37:19
@Guchenxi0971 对不起我是纸张。
可是还有问题,样例还过不了?
by Guchenxi0971 @ 2024-07-15 21:39:53
void update(int u,int l,int r,int a,int b,int k)
{
if(a<=l&&b>=r)
{
t[u]=(r-l+1)*k;
tl[u][k]=r-l+1;
tr[u][k]=r-l+1;
mt[u][k]=r-l+1;
tl[u][!k]=0;//r-l+1;
tr[u][!k]=0;//r-l+1;
mt[u][!k]=0;//r-l+1;
lazy[u]=k;
lazyf[u]=0;
return ;
}
push_down(u,l,r);
int mid=(l+r)/2;
if(a<=mid)
{
update(lt,a,b,k);
}
if(b>mid)
{
update(rt,a,b,k);
}
push_up(u,l,r);
}
void push_down(int u,int l,int r)
{
int mid=(l+r)/2;
if(lazy[u]!=-1)
{
lazy[ls]=lazy[u];
t[ls]=(mid-l+1)*lazy[u];
tl[ls][lazy[u]]=mid-l+1;
tr[ls][lazy[u]]=mid-l+1;
mt[ls][lazy[u]]=mid-l+1;
tl[ls][!lazy[u]]=0;//mid-l+1;
tr[ls][!lazy[u]]=0;//mid-l+1;
mt[ls][!lazy[u]]=0;
lazyf[ls]=0;
lazy[rs]=lazy[u];
t[rs]=(r-mid)*lazy[u];
tl[rs][lazy[u]]=r-mid;
tr[rs][lazy[u]]=r-mid;
mt[rs][lazy[u]]=r-mid;
tl[rs][!lazy[u]]=0;//r-mid;
tr[rs][!lazy[u]]=0;//r-mid;
mt[rs][!lazy[u]]=0;//r-mid;
lazyf[rs]=0;
lazy[u]=-1;
}
if(lazyf[u])
{
t[ls]=mid-l+1-t[ls];
swap(tl[ls][1],tl[ls][0]);
swap(tr[ls][1],tr[ls][0]);
swap(mt[ls][1],mt[ls][0]);
if(lazy[ls]!=-1)
{
lazy[ls]^=1;
}
lazyf[ls]^=1;
t[rs]=r-mid-t[rs];
swap(tl[rs][1],tl[rs][0]);
swap(tr[rs][1],tr[rs][0]);
swap(mt[rs][1],mt[rs][0]);
if(lazy[rs]!=-1)
{
lazy[rs]^=1;
}
lazyf[rs]^=1;
lazyf[u]=0;
}
}
@dist_22r 这是目前已知的错误,然后可以过样例,但是10pts
by dist_22r @ 2024-07-15 21:46:59
@Guchenxi0971 调过了,此帖结
by dist_22r @ 2024-07-15 21:47:47
问题出在push_down上,下传标记的顺序反了
by dist_22r @ 2024-07-15 21:48:40
@dist_22r 应该先下传反转标记再下传赋值标记