16分求调
查看原帖
16分求调
747783
wrz238516楼主2023/8/23 21:58
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6;
int n,m;
int pos;
struct node{
	int l;
	int r;
	int numl;
	int numr;
	int maxl;//最大前缀 
	int maxr;//最大后缀 
	int len; 
	int ans;
	node(){
		
	}
};
node tree[maxn*4];
void pushup(int idx){
	tree[idx].numl=tree[idx*2].numl;
	tree[idx].numr=tree[idx*2+1].numr;
	tree[idx].maxl=tree[idx*2].maxl;
	tree[idx].maxr=tree[idx*2+1].maxr;
	if(tree[idx*2].maxl==tree[idx*2].len){
		if(tree[idx*2].numr!=tree[idx*2+1].numl){
			tree[idx].maxl=max(tree[idx].maxl,tree[idx*2].maxl+tree[idx*2+1].maxl);
		}
	}
	if(tree[idx*2+1].maxr==tree[idx*2+1].len){
		if(tree[idx*2+1].numl!=tree[idx*2].numr){
			tree[idx].maxr=max(tree[idx].maxr,tree[idx*2+1].maxr+tree[idx*2].maxr);
		}
	}
	tree[idx].ans=max(tree[idx].ans,tree[idx*2].ans);
	tree[idx].ans=max(tree[idx].ans,tree[idx*2+1].ans);
	if(tree[idx*2].numr!=tree[idx*2+1].numl){
		tree[idx].ans=max(tree[idx].ans,tree[idx*2].maxr+tree[idx*2+1].maxl);
	}
}
void build(int idx,int l,int r){
	tree[idx].l=l;
	tree[idx].r=r;
	tree[idx].len=tree[idx].r-tree[idx].l+1;
	if(tree[idx].l==tree[idx].r){
		tree[idx].maxl=1;
		tree[idx].maxr=1;
		tree[idx].numl=1;
		tree[idx].numr=1;
		tree[idx].ans=1;
		return;
	}
	int mid=(tree[idx].l+tree[idx].r)/2;
	build(idx*2,l,mid);
	build(idx*2+1,mid+1,r);
	pushup(idx);
}
void update(int idx,int pos){
	if(tree[idx].l==pos&&tree[idx].r==pos){
		tree[idx].numl^=1;
		tree[idx].numr^=1;
		return;
	}
	int mid=(tree[idx].l+tree[idx].r)/2;
	if(pos<=mid){
		update(idx*2,pos);
	}else{
		update(idx*2+1,pos);
	}
	pushup(idx);
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin>>n;
	build(1,1,n);
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>pos;
		update(1,pos);
		cout<<tree[1].ans<<"\n";
	}
	
} 
2023/8/23 21:58
加载中...