求调
查看原帖
求调
665095
Rank114514楼主2024/10/20 22:24
#include<bits/stdc++.h>
#define _forp(i,x,y) for(int i=x; i>=y; i--)
#define _for(i,x,y) for(int i=x; i<=y; i++)
using namespace std;
const int MAXN=5e5+5;
typedef long long ll;
#define int long long
int a[MAXN];
bool b[5*MAXN];
int sz[5*MAXN];
int fa[5*MAXN];
int find(int x){
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
signed main(){
	int n,ans=0;
	cin>>n;
	_for(i,0,5e5){
		fa[i]=i;
		sz[i]=1;
	}
	_for(i,1,n){
		cin>>a[i];
		if(b[a[i]]){
			cout<<ans<<" ";
			continue;
		}
		b[a[i]]=1;
		if(b[a[i]-1]&&b[a[i]+1]){
			int fa1=find(b[a[i]-1]),fa2=find(b[a[i]+1]);
			ans=ans-((sz[fa1]+1)>>1)-((sz[fa2]+1)>>1);
			sz[a[i]]=sz[fa1]+sz[fa2]+1;
			fa[fa2]=a[i];
			fa[fa1]=a[i];
			ans=ans+((sz[a[i]]+1)>>1);
			
		}
		else if(b[a[i]-1]){
			int fat=find(b[a[i]-1]);
			ans=ans-((sz[fat]+1)>>1);
			sz[a[i]]=sz[fat]+1;
			fa[fat]=a[i];
			ans=ans+((sz[a[i]]+1)>>1);
			
			
		}
		else if(b[a[i]+1]){
			int fat=find(b[a[i]+1]);
			ans=ans-((sz[fat]+1)>>1);
			sz[a[i]]=sz[fat]+1;
			fa[fat]=a[i];
			ans=ans+((sz[a[i]]+1)>>1);
			
		}
		else ans++;
		
		cout<<ans<<" ";
	}
	
	return 0;
}

2024/10/20 22:24
加载中...