社区讨论

诗山代码求条,WA on all the test,玄关

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mkgv5btp
此快照首次捕获于
2026/01/16 20:37
上个月
此快照最后确认于
2026/01/18 23:55
上个月
查看原帖
CPP
#include<bits/stdc++.h>
#define lc p<<1
#define rc p<<1|1
#define endl putchar('\n')
#define psp putchar(' ')
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=1e5+5;
int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
	return x*f;
}
void print(int x){
	if(x<0)putchar('-'),x=-x;
	if(x<10){putchar(x+'0');return;}
	print(x/10);
	putchar(x%10+'0');
}
void putstr(string s){
	for(int i=0;i<s.size();i++)putchar(s[i]);
}
int lowbit(int x){
	return x&-x;
}
int n,m,k;
int T;
int a[N];
struct node{
	int l,r,num0,num1;
	int ans0,ans1;
	int lans0,rans0;
	int lans1,rans1;
	int tag,cnt;
	int L,R;
	int len;
}f[4*N];
void pushup(int p){
	f[p].num0=f[lc].num0+f[rc].num0;
	f[p].num1=f[lc].num1+f[rc].num1;
	f[p].ans0=max(f[lc].ans0,f[rc].ans0);
	f[p].ans1=max(f[lc].ans1,f[rc].ans1);
	if(f[lc].R==f[rc].L&&f[lc].R==0)f[p].ans0=max(f[p].ans0,f[lc].rans0+f[rc].lans0);
	if(f[lc].R==f[rc].L&&f[lc].R==1)f[p].ans1=max(f[p].ans1,f[lc].rans1+f[rc].lans1);
	f[p].lans0=f[lc].lans0==f[lc].len?f[lc].lans0+f[rc].lans0:f[lc].lans0;
	f[p].lans1=f[lc].lans1==f[lc].len?f[lc].lans1+f[rc].lans1:f[lc].lans1;
	f[p].rans0=f[rc].rans0==f[rc].len?f[rc].rans0+f[lc].rans0:f[rc].rans0;
	f[p].rans1=f[rc].rans1==f[rc].len?f[rc].rans1+f[lc].rans1:f[rc].rans1;
	f[p].L=f[lc].L;
	f[p].R=f[rc].R;
}
void build(int p,int l,int r){
	f[p]=node{l,r,a[l]==0,a[l]==1,a[l]==0,a[l]==1,a[l]==0,a[l]==0,a[l]==1,a[l]==1,-1,0,a[l],a[l],r-l+1};
	if(l==r)return;
	int mid=l+r>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	pushup(p);
}
void down(int p){
	if(f[p].tag){
		f[lc].tag=f[rc].tag=f[p].tag;
		if(f[p].tag==0){
			f[lc].lans1=f[lc].rans1=f[lc].ans1=f[lc].num1=0;
			f[rc].lans1=f[rc].rans1=f[rc].ans1=f[rc].num1=0;
			f[lc].lans0=f[lc].rans0=f[lc].ans0=f[lc].num0=f[lc].len;
			f[rc].lans0=f[rc].rans0=f[rc].ans0=f[rc].num0=f[rc].len;
		}
		else{
			f[lc].lans1=f[lc].rans1=f[lc].ans1=f[lc].num1=f[lc].len;
			f[rc].lans1=f[rc].rans1=f[rc].ans1=f[rc].num1=f[rc].len;
			f[lc].lans0=f[lc].rans0=f[lc].ans0=f[lc].num0=0;
			f[rc].lans0=f[rc].rans0=f[rc].ans0=f[rc].num0=0;
		}
		f[lc].L=f[lc].R=f[rc].L=f[rc].R=f[p].tag;
		f[p].cnt=0;
		f[p].tag=-1;
	}
	if(f[p].cnt%2){
		f[lc].cnt++,f[rc].cnt++;
		swap(f[lc].lans0,f[lc].lans1);
		swap(f[lc].rans0,f[lc].rans1);
		swap(f[rc].lans0,f[rc].lans1);
		swap(f[rc].rans0,f[rc].rans1);
		swap(f[lc].ans0,f[lc].ans1);
		swap(f[rc].ans0,f[rc].ans1);
		swap(f[lc].num0,f[lc].num1);
		swap(f[rc].num0,f[rc].num1);
		f[lc].L=1-f[lc].L;
		f[lc].R=1-f[lc].R;
		f[rc].L=1-f[rc].L;
		f[rc].R=1-f[rc].R;
		if(f[lc].tag!=-1)f[lc].tag=1-f[lc].tag;
		if(f[rc].tag!=-1)f[rc].tag=1-f[rc].tag;
		f[p].cnt=0;
	}
}
void update(int p,int l,int r,int k){
	if(l<=f[p].l&&f[p].r<=r){
		if(k==0){
			f[p].lans1=f[p].rans1=f[p].ans1=f[p].num1=0;
			f[p].lans0=f[p].rans0=f[p].ans0=f[p].num0=f[p].len;
		}
		else{
			f[p].lans1=f[p].rans1=f[p].ans1=f[p].num1=f[p].len;
			f[p].lans0=f[p].rans0=f[p].ans0=f[p].num0=0;
		}
		f[p].L=f[p].R=k;
		f[p].tag=k;
		return;
	}
	down(p);
	int mid=f[p].l+f[p].r>>1;
	if(l<=mid)update(lc,l,r,k);
	if(r>mid)update(rc,l,r,k);
	pushup(p);
}
void flip(int p,int l,int r){
	if(l<=f[p].l&&f[p].r<=r){
		swap(f[p].lans0,f[p].lans1);
		swap(f[p].rans0,f[p].rans1);
		swap(f[p].ans0,f[p].ans1);
		swap(f[p].num0,f[p].num1);
		if(f[p].tag!=-1)f[p].tag=1-f[p].tag;
		f[p].cnt++;
		f[p].L=1-f[p].L;
		f[p].R=1-f[p].R;
		return;
	}
	down(p);
	int mid=f[p].l+f[p].r>>1;
	if(l<=mid)flip(lc,l,r);
	if(r>mid)flip(rc,l,r);
	pushup(p);
}
int query_num(int p,int l,int r){
	if(l<=f[p].l&&f[p].r<=r){
		return f[p].num1;
	}
	down(p);
	int mid=f[p].l+f[p].r>>1;
	int res=0;
	if(l<=mid)res+=query_num(lc,l,r);
	if(r>mid)res+=query_num(rc,l,r);
	return res;
}
node query(int p,int l,int r){
	if(l<=f[p].l&&f[p].r<=r){
		return f[p];
	}
	down(p);
	int mid=f[p].l+f[p].r>>1;
	node res={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
	if(r<=mid){
		return query(lc,l,r);
	}
	else if(l>mid){
		return query(rc,l,r);
	}
	else{
		node ls=query(lc,l,r);
		node rs=query(rc,l,r);
		res.ans1=max(ls.ans1,rs.ans1);
		if(ls.R==rs.L&&ls.R==1)res.ans1=max(res.ans1,ls.rans1+rs.lans1);
		res.L=ls.L;
		res.R=rs.R;
		res.len=ls.len+rs.len;
		res.lans1=ls.lans1==ls.len?ls.lans1+ls.lans1:ls.lans1;
		res.rans1=rs.rans1==rs.len?rs.rans1+rs.rans1:rs.rans1;
		return res;
	}
}
signed main(){
	//ios::sync_with_stdio(0);
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	build(1,1,n);
	while(m--){
		int op=read(),l=read(),r=read();
		if(op==0){
			update(1,l,r,0);
		}
		else if(op==1){
			update(1,l,r,1);
		}
		else if(op==2){
			flip(1,l,r);
		}
		else if(op==3){
			print(query_num(1,l,r)),endl;
		}
		else{
			print(query(1,l,r).ans1),endl;
		}
	}
}

回复

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

正在加载回复...