求助
查看原帖
求助
809708
whssy楼主2023/7/24 17:22
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,q;
bool f[N];
struct line{
	int l,r,max_l,max_r,max_all;
};
line tree[N*4];
void add(int k){
	int lenl=tree[k<<1].r-tree[k<<1].l+1,
	lenr=tree[k<<1|1].r-tree[k<<1|1].l+1;
	tree[k].max_l=tree[k<<1].max_l;
	tree[k].max_r=tree[k<<1|1].max_r;
	tree[k].max_all=max(tree[k<<1].max_l,tree[k<<1|1].max_r);
	if(f[tree[k<<1].r]^f[tree[k<<1|1].l]){
		tree[k].max_all=max(tree[k].max_all,tree[k<<1].max_r+tree[k<<1|1].max_l);
		if(tree[k<<1].max_all==lenl) tree[k].max_l=lenl+tree[k<<1|1].max_l;
		if(tree[k<<1|1].max_all==lenr) tree[k].max_r=lenr+tree[k<<1].max_r;
	}
}
void build(int k,int l,int r){
	tree[k].l=l;tree[k].r=r;
	if(l==r){
		tree[k].max_l=1;
		tree[k].max_r=1;
		tree[k].max_all=1;
		return;
	}
	int mid=l+r>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	add(k);
}
void change(int k,int id){
	if(tree[k].l==tree[k].r){
		f[id]^=1;
		return;
	}
	int mid=tree[k].l+tree[k].r>>1;
	if(id<=mid) change(k<<1,id);
	else change(k<<1|1,id);
	add(k);
}
int main(){
	scanf("%d%d",&n,&q);
	build(1,1,n);
	while(q--){
		int qid;
		scanf("%d",&qid);
		change(1,qid);
		printf("%d\n",tree[1].max_all);
	}
	return 0;
}
2023/7/24 17:22
加载中...