社区讨论

10pts求调

P2572[SCOI2010] 序列操作参与者 3已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@mhj1imjj
此快照首次捕获于
2025/11/03 19:11
4 个月前
此快照最后确认于
2025/11/03 19:11
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m,a[N];
struct SegmentTree{
	struct node{
		int l,r,sz;
		int sum,tag,lz;
		int lsum1,rsum1,dat1;
		int lsum0,rsum0,dat0;
	}t[N<<2];
	inline void pushup(node &p,node &l,node &r){
		p.sum=l.sum+r.sum;
		p.lsum0=l.lsum0+(l.lsum0==l.sz?r.lsum0:0);
		p.rsum0=r.rsum0+(r.rsum0==r.sz?l.rsum0:0);
		p.lsum1=l.lsum1+(l.lsum1==l.sz?r.lsum1:0);
		p.rsum1=r.rsum1+(r.rsum1==r.sz?l.rsum1:0);
		p.dat0=max(max(l.dat0,r.dat0),l.rsum0+r.lsum0);
		p.dat1=max(max(l.dat1,r.dat1),l.rsum1+r.lsum1);
	}
	inline void pushdown(int p){
		if (~t[p].tag){
			int l=(p<<1),r=(p<<1|1),v=t[p].tag;
			
			t[l].sum=v*t[l].sz;
			t[l].lsum0=(v?0:t[l].sz);
			t[l].rsum0=(v?0:t[l].sz);
			t[l].dat0=(v?0:t[l].sz);
			t[l].lsum1=(!v?0:t[l].sz);
			t[l].rsum1=(!v?0:t[l].sz);
			t[l].dat1=(!v?0:t[l].sz);
			t[l].tag=v;
			
			t[r].sum=v*t[r].sz;
			t[r].lsum0=(v?0:t[r].sz);
			t[r].rsum0=(v?0:t[r].sz);
			t[r].dat0=(v?0:t[r].sz);
			t[r].lsum1=(!v?0:t[r].sz);
			t[r].rsum1=(!v?0:t[r].sz);
			t[r].dat1=(!v?0:t[r].sz);
			t[r].tag=v;
			
			t[p].tag=-1;
			t[p].lz=0;
		}
		if (t[p].lz){
			int l=(p<<1),r=(p<<1|1);
			
			if(~t[l].tag) t[l].tag^=1;
			else t[l].lz^=1;
			if(~t[r].tag) t[r].tag^=1;
			else t[r].lz^=1;
			
			t[l].sum=t[l].sz-t[l].sum;
			swap(t[l].lsum1,t[l].lsum0);
			swap(t[l].rsum1,t[l].rsum0); 
			swap(t[l].dat1,t[l].dat0);
			
			t[r].sum=t[r].sz-t[r].sum;
			swap(t[r].lsum1,t[r].lsum0);
			swap(t[r].rsum1,t[r].rsum0); 
			swap(t[r].dat1,t[r].dat0);
			
			t[p].lz=0;
		}
	}
	inline void build(int p,int l,int r){
		t[p].l=l;t[p].r=r;t[p].sz=r-l+1;
		t[p].tag=-1;t[p].lz=0;
		if (l==r){
			t[p].sum=a[l];
			t[p].lsum0=t[p].rsum0=t[p].dat0=!a[l];
			t[p].lsum1=t[p].rsum1=t[p].dat1=a[l];
			return ;
		}int mid=(l+r)>>1;
		build(p<<1,l,mid);
		build(p<<1|1,mid+1,r);
		pushup(t[p],t[p<<1],t[p<<1|1]);
	}
	inline int asksum(int p,int l,int r){
		if (l<=t[p].l&&r>=t[p].r)
			return t[p].sum;
		pushdown(p);
		int mid=(t[p].l+t[p].r)>>1,val=0;
		if (l<=mid) val+=asksum(p<<1,l,r);
		if (r>mid) val+=asksum(p<<1|1,l,r);
		return val;
	}
	inline node askdat_init(int p,int l,int r){
		if (l<=t[p].l&&r>=t[p].r) return t[p];
		int mid=(t[p].l+t[p].r)>>1;
		pushdown(p);
		if (r<=mid) return askdat_init(p<<1,l,r);
		if (l>mid) return askdat_init(p<<1|1,l,r);
		node pl=askdat_init(p<<1,l,r);
		node pr=askdat_init(p<<1|1,l,r),ans;
		pushup(ans,pl,pr);
		return ans;
	}
	inline int askdat(int p,int l,int r){
		return askdat_init(p,l,r).dat1;
	}
	inline void update1(int p,int l,int r,int v){
		if (l<=t[p].l&&r>=t[p].r){
			t[p].sum=v*t[p].sz;
			t[p].lsum0=(v?0:t[p].sz);
			t[p].rsum0=(v?0:t[p].sz);
			t[p].dat0=(v?0:t[p].sz);
			t[p].lsum1=(!v?0:t[p].sz);
			t[p].rsum1=(!v?0:t[p].sz);
			t[p].dat1=(!v?0:t[p].sz);
			t[p].tag=v;
			return ;
		}pushdown(p);
		int mid=(t[p].l+t[p].r)>>1;
		if (l<=mid) update1(p<<1,l,r,v);
		if (r>mid) update1(p<<1|1,l,r,v);
		pushup(t[p],t[p<<1],t[p<<1|1]);
	}
	inline void update2(int p,int l,int r){
		if (l<=t[p].l&&r>=t[p].r){
			t[p].sum=t[p].sz-t[p].sum;
			swap(t[p].lsum1,t[p].lsum0);
			swap(t[p].rsum1,t[p].rsum0); 
			swap(t[p].dat1,t[p].dat0);
			t[p].lz^=1;
			return ;
		}pushdown(p);
		int mid=(t[p].l+t[p].r)>>1;
		if (l<=mid) update2(p<<1,l,r);
		if (r>mid) update2(p<<1|1,l,r);
		pushup(t[p],t[p<<1],t[p<<1|1]);
	}
}st;
int main(){
	cin>>n>>m;
	for (int i=1;i<=n;i++) cin>>a[i];
	st.build(1,1,n);
	while (m--){
		int op,l,r,ll,rr;
		cin>>op>>l>>r;++l;++r;
		if (l>r) swap(l,r);
		if (op==0) st.update1(1,l,r,0);
		if (op==1) st.update1(1,l,r,1);
		if (op==2) st.update2(1,l,r);
		if (op==3) cout<<st.asksum(1,l,r)<<'\n';
		if (op==4) cout<<st.askdat(1,l,r)<<'\n';
	}
	return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...