分块40求调,玄关
查看原帖
分块40求调,玄关
936616
zibenlun楼主2024/3/11 19:33
#include<bits/stdc++.h>
#define ll long long
#define int long long
#define int_128 __int128
#define lowbit(x) (x&(-x))
using namespace std;
int pos[2000005],n,m,len;
int a[2000005];
struct nd{
	int l,r,lsize,rsize,maxx;
}c[50005];
void jisuan(int x){
	int cnt=1,maxx=1;
	c[pos[x]].lsize=0;
	for(int i=c[pos[x]].l+1;i<=c[pos[x]].r;i++){
		if(a[i]!=a[i-1]){
			cnt++;
		}
		else {
			maxx=max(maxx,cnt);
			if(i-cnt+1==c[pos[x]].l){
				c[pos[x]].lsize=cnt;
			}
			cnt=1;
		}
	}
	if(c[pos[x]].lsize==0){
		c[pos[x]].lsize=cnt;
	}
	c[pos[x]].rsize=cnt;
	c[pos[x]].maxx=max(maxx,cnt);
}
void check(){
	int ans=c[1].maxx,cnt=c[1].rsize;
	for(int i=2;c[i].l;i++){
		ans=max(ans,c[i].maxx);
		ans=max(ans,c[i].rsize);
		ans=max(ans,c[i].lsize);
		if(a[c[i].l]!=a[c[i-1].r]){
			cnt+=c[i].lsize;
			ans=max(ans,cnt);
			if(c[i].lsize!=c[i].r-c[i].l+1){
				cnt=c[i].rsize;
			}
		}
		else {
			cnt=c[i].rsize; 
		}
	}
	cout<<ans<<"\n";
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	len=500;
	for(int i=1;i<=n;i++){
		a[i]=1;
		pos[i]=i/len+(i%len!=0);
		if(i%len==1){ 
			c[pos[i]].l=i;
		}
		c[pos[i]].r=i;
		c[pos[i]].maxx=1;
		c[pos[i]].lsize=1;
		c[pos[i]].rsize=1;
	}
	for(int i=1;i<=m;i++){
		int x;
		cin>>x;
		a[x]=!a[x];
		jisuan(x);
		check();
	}
	return 0;
}
2024/3/11 19:33
加载中...