求调求调要疯了
查看原帖
求调求调要疯了
666647
LiuCarry楼主2024/10/19 10:36

调了快一天了孩子要似了求调求调

样例能过,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

*/
2024/10/19 10:36
加载中...