只过了hack求调玄关
查看原帖
只过了hack求调玄关
553604
lsz0205楼主2024/11/28 10:33
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int a[200010];
struct NODE {
	int l;
	int r;
	int add;
	int ze;
	int sum;
	int ma[2];
	int lma[2];
	int rma[2];
} tr[800010];
void ex(int &a,int &b){
	int t=a;
	a=b;
	b=t;
}
void pushup(NODE &root,NODE &zuo,NODE &you) {
	root.sum=zuo.sum+you.sum;
	for(int i=0; i<=1; i++) {
		root.lma[i]=zuo.lma[i];
		if(i==1&&zuo.sum==zuo.r-zuo.l+1) {
			root.lma[i]+=you.lma[i];
		} else if(i==0&&zuo.sum==0) {
			root.lma[i]+=you.lma[i];
		}

		root.rma[i]=you.rma[i];
		if(i==1&&you.sum==you.r-you.l+1) {
			root.rma[i]+=zuo.rma[i];
		} else if(i==0&&zuo.sum==0) {
			root.rma[i]+=zuo.lma[i];
		}

		root.ma[i]=zuo.rma[i]+you.lma[i];
		root.ma[i]=max(root.ma[i],zuo.ma[i]);
		root.ma[i]=max(root.ma[i],you.ma[i]);
	}
}
void pushup(int u) {
	pushup(tr[u],tr[u<<1],tr[(u<<1)|1]);
}
void build(int u,int l,int r) {
	if(l==r) {
		tr[u]=(NODE) {
			l,r,0,-1,a[l]
		};
		if(a[l]==0) {
			tr[u].ma[0]=tr[u].lma[0]=tr[u].rma[0]=1;
		} else {
			tr[u].ma[0]=tr[u].lma[0]=tr[u].rma[0]=0;
		}
		if(a[l]==1) {
			tr[u].ma[1]=tr[u].lma[1]=tr[u].rma[1]=1;
		} else {
			tr[u].ma[1]=tr[u].lma[1]=tr[u].rma[1]=0;
		}
		return ;
	}
	tr[u]=(NODE) {
		l,r,0,-1
	};
	int mid=(l+r)/2;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);

	pushup(u);
}
void work(NODE &ans,int k) {
	if(k==1) {
		ans.ze=1;
		ans.add=0;
		ans.sum=(ans.r-ans.l+1);
		ans.ma[k]=ans.lma[k]=ans.rma[k]=ans.r-ans.l+1;
		ans.ma[k^1]=ans.lma[k^1]=ans.rma[k^1]=0;
	}
	if(k==0) {
		ans.ze=0;
		ans.add=0;
		ans.sum=0;
		ans.ma[k]=ans.lma[k]=ans.rma[k]=ans.r-ans.l+1;
		ans.ma[k^1]=ans.lma[k^1]=ans.rma[k^1]=0;
	}
	if(k==3) {
		ans.sum=(ans.r-ans.l+1)-ans.sum;
		if(ans.ze!=-1) ans.ze^=1;
		else ans.add^=1;
		ex(ans.ma[0],ans.ma[1]);
		ex(ans.lma[0],ans.lma[1]);
		ex(ans.rma[0],ans.rma[1]);
	}
}
void pushdown(int u) {
	if(tr[u].ze!=-1) {
		tr[u].add=0;
		work(tr[u<<1],tr[u].ze);
		work(tr[u<<1|1],tr[u].ze);
		tr[u].ze=-1;
	}
	if(tr[u].add) {
		work(tr[u<<1],3);
		work(tr[u<<1|1],3);
		tr[u].add=0;
	}

}
NODE query(int u,int l,int r) {
	if(l<=tr[u].l&&tr[u].r<=r) return tr[u];
	pushdown(u);

	NODE ans;
	int mid=(tr[u].l+tr[u].r)/2;
	if(mid<l) ans=query(u<<1|1,l,r);
	else if(r<=mid) ans=query(u<<1,l,r);
	else {
		NODE zuo=query(u<<1,l,r);
		NODE you=query(u<<1|1,l,r);
		pushup(ans,zuo,you);
	}
	return ans;
}
void modify(int u,int l,int r,int k) {
	if(l<=tr[u].l&&tr[u].r<=r) {
		work(tr[u],k);
		return ;
	}
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)/2;

	if(mid<l) modify(u<<1|1,l,r,k);
	else if(r<=mid) modify(u<<1,l,r,k);
	else {
		modify(u<<1,l,r,k);
		modify(u<<1|1,l,r,k);
	}
	pushup(u);
}
signed main() {
	scanf("%lld%lld",&n,&m);
	for(int i=1; i<=n; i++) {
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	while(m--) {
		int op,l,r;
		scanf("%lld%lld%lld",&op,&l,&r);
		l++,r++;
		if(op==0) {
			modify(1,l,r,0);
		} else if(op==1) {
			modify(1,l,r,1);
		} else if(op==2) {
			modify(1,l,r,3);
		} else if(op==3) {
			printf("%lld\n",query(1,l,r).sum);
		}else{
			printf("%lld\n",query(1,l,r).ma[1]);
		}
	}
	return 0;
}
2024/11/28 10:33
加载中...