求条,马蜂良好,A了subtask1不过subtask0一个没过
查看原帖
求条,马蜂良好,A了subtask1不过subtask0一个没过
1391401
join_in_team_64334楼主2024/8/7 16:35

阳历过了,这是提交信息

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[100005],op,l,r,tag[100005<<4],fz[100005<<4];
struct o{
	int s,sum,lsum,rsum;
}tr0[100005<<4],tr1[100005<<4];
void pushup(int c,int l,int r,int mid){
	tr1[c].s=tr1[c<<1].s+tr1[c<<1|1].s;
	tr1[c].sum=max(tr1[c<<1].sum,max(tr1[c<<1|1].sum,tr1[c<<1].rsum+tr1[c<<1|1].lsum));
	if(tr1[c<<1].sum==mid-l+1)tr1[c].lsum=tr1[c<<1].sum+tr1[c<<1|1].lsum;
	else tr1[c].lsum=tr1[c<<1].lsum;
	if(tr1[c<<1|1].sum==r-mid)tr1[c].rsum=tr1[c<<1|1].sum+tr1[c<<1].rsum;
	else tr1[c].rsum=tr1[c<<1|1].rsum;
	
	tr0[c].s=tr0[c<<1].s+tr0[c<<1|1].s;
	tr0[c].sum=max(tr0[c<<1].sum,max(tr0[c<<1|1].sum,tr0[c<<1].rsum+tr0[c<<1|1].lsum));
	if(tr0[c<<1].sum==mid-l+1)tr0[c].lsum=tr0[c<<1].sum+tr0[c<<1|1].lsum;
	else tr0[c].lsum=tr0[c<<1].lsum;
	if(tr0[c<<1|1].sum==r-mid)tr0[c].rsum=tr0[c<<1|1].sum+tr0[c<<1].rsum;
	else tr0[c].rsum=tr0[c<<1|1].rsum;
}
void build(int l,int r,int c){
	if(l==r){
		tr1[c].s=tr1[c].sum=tr1[c].lsum=tr1[c].rsum=a[l];
		tr0[c].s=tr0[c].sum=tr0[c].lsum=tr0[c].rsum=!a[l];
		tag[c]=-1;
		return;
	}
	int mid=l+r>>1;
	build(l,mid,c<<1),build(mid+1,r,c<<1|1);
	pushup(c,l,r,mid),tag[c]=-1;
}
void pushdown(int c,int l,int r,int mid){
	if(tag[c]!=-1){
		tr1[c<<1].s=tr1[c<<1].sum=tr1[c<<1].lsum=tr1[c<<1].rsum=tag[c]*(mid-l+1);
		tr1[c<<1|1].s=tr1[c<<1|1].sum=tr1[c<<1|1].lsum=tr1[c<<1|1].rsum=tag[c]*(r-mid);
		
		tr0[c<<1].s=tr0[c<<1].sum=tr0[c<<1].lsum=tr0[c<<1].rsum=!tag[c]*(mid-l+1);
		tr0[c<<1|1].s=tr0[c<<1|1].sum=tr0[c<<1|1].lsum=tr0[c<<1|1].rsum=!tag[c]*(r-mid);
		
		tag[c<<1]=tag[c<<1|1]=tag[c];
		tag[c]=-1;
	}
	if(fz[c]){
		swap(tr0[c<<1],tr1[c<<1]);
		swap(tr0[c<<1|1],tr1[c<<1|1]);
		fz[c<<1]=fz[c<<1|1]=fz[c];
		fz[c]=0;
	}
}
void update(int l,int r,int x,int y,int d,int c){
	if(x<=l&&r<=y){
		tag[c]=d;
		fz[c]=0;
		tr1[c].s=tr1[c].sum=tr1[c].lsum=tr1[c].rsum=(r-l+1)*d;
		tr0[c].s=tr0[c].sum=tr0[c].lsum=tr0[c].rsum=(r-l+1)*!d;
		return;
	}
	int mid=l+r>>1;
	pushdown(c,l,r,mid);
	if(x<=mid)update(l,mid,x,y,d,c<<1);
	if(y>mid)update(mid+1,r,x,y,d,c<<1|1);
	pushup(c,l,r,mid);
}
void updatefz(int l,int r,int x,int y,int c){
	if(x<=l&&r<=y){
		fz[c]^=1;
		swap(tr0[c],tr1[c]);
		return;
	}
	int mid=l+r>>1;
	pushdown(c,l,r,mid);
	if(x<=mid)updatefz(l,mid,x,y,c<<1);
	if(y>mid)updatefz(mid+1,r,x,y,c<<1|1);
	pushup(c,l,r,mid);
}
int querysum(int l,int r,int x,int y,int c){
	if(x<=l&&r<=y)return tr1[c].s;
	int mid=l+r>>1,ans=0;
	pushdown(c,l,r,mid);
	if(x<=mid)ans+=querysum(l,mid,x,y,c<<1);
	if(y>mid)ans+=querysum(mid+1,r,x,y,c<<1|1);
	return ans;
}
o querylx(int l,int r,int x,int y,int c){
	if(x<=l&&r<=y)return tr1[c];
	int mid=l+r>>1;
	pushdown(c,l,r,mid);
	if(y<=mid)return querylx(l,mid,x,y,c<<1);
	if(x>mid)return querylx(mid+1,r,x,y,c<<1|1);
	o t=querylx(l,mid,x,y,c<<1),v=querylx(mid+1,r,x,y,c<<1|1);
	return {t.s+v.s,max(t.sum,max(v.sum,t.rsum+v.lsum)),(t.sum==mid-l+1?t.sum+v.lsum:t.lsum),(v.sum==r-mid?v.sum+t.rsum:v.rsum)};
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,n,1);
	while(m--){
		cin>>op>>l>>r,l++,r++;
		if(op-2<0)update(1,n,l,r,op,1);
		if(op==2)updatefz(1,n,l,r,1);
		if(op==3)cout<<querysum(1,n,l,r,1)<<endl;
		if(op==4)cout<<querylx(1,n,l,r,1).sum<<endl;
	}
	return 0;
}
2024/8/7 16:35
加载中...