线段树,16pts求助
查看原帖
线段树,16pts求助
733857
lintianhong楼主2024/8/23 20:42
#include<bits/stdc++.h>
using namespace std;
int n,q;
int a[200005];
int x;
struct Tree {
	int len;
	int lmax;
	int rmax;
	int ccfmax;
	int l;
	int r;
}tree[800005];
void work(int now,int k) {
	tree[now].ccfmax=1;
	tree[now].lmax=1;
	tree[now].rmax=1;
	tree[now].l=k;
	tree[now].r=k;
	return ;
}
void push_up(int now) {
	if(tree[now*2].r!=tree[now*2+1].l) tree[now].ccfmax=max(max(tree[now*2].ccfmax,tree[now*2+1].ccfmax),max(tree[now*2].rmax+tree[now*2+1].lmax,tree[now].ccfmax));
	else tree[now].ccfmax=max(tree[now*2].ccfmax,tree[now*2+1].ccfmax);
	tree[now].l=tree[now*2].l;
	tree[now].r=tree[now*2+1].r;
	if(tree[now*2].lmax==tree[now*2].len&&tree[now*2].r!=tree[now*2+1].l) tree[now].lmax=tree[now*2].lmax+tree[now*2+1].lmax;
	else tree[now].lmax=tree[now*2].lmax;
	if(tree[now*2+1].rmax==tree[now*2+1].len&&tree[now*2].r!=tree[now*2+1].l) tree[now].rmax=tree[now*2+1].rmax+tree[now*2].rmax;
	else tree[now].rmax=tree[now*2+1].rmax;
	return ;
}
void build(int now,int left,int right) {
	tree[now].len=right-left+1;
	if(left==right) {
		work(now,0);
		return ;
	}
	build(now*2,left,(left+right)/2);
	build(now*2+1,(left+right)/2+1,right);
	push_up(now);
	return ;
}
void change(int now,int left,int right,int w) {
	if(left==right) {
		work(now,!tree[now].l);
		return ;
	}
	if(w<=(left+right)/2) change(now*2,left,(left+right)/2,w);
	else if(w>=(left+right)/2) change(now*2+1,(left+right)/2+1,right,w);
	push_up(now);
	return ;
}
int main(){
	scanf("%d%d",&n,&q);
	build(1,1,n);
	for(int i=1;i<=q;i++) {
		scanf("%d",&x);
		change(1,1,n,x);
		printf("%d\n",tree[1].ccfmax);
	}
	return 0;
}
2024/8/23 20:42
加载中...