自己测试能输出,交上去全RE:(求调
查看原帖
自己测试能输出,交上去全RE:(求调
1278879
wjxalex楼主2024/9/25 01:21
#include <iostream>
#include <vector>
using namespace std;
const int N=1000001;
int dsu1[N]={},dsu2[N]={};
bool vis[N]={};
int getfather(int dsu[],int u){
	if(dsu[u]==u){
		return u;
	}
	dsu[u]=getfather(dsu,dsu[u]);
	return dsu[u];
}
int unite1(int u,int v){
	dsu1[getfather(dsu1,u)]=getfather(dsu1,v);
}
int unite2(int u,int v){
	dsu2[getfather(dsu2,u)]=getfather(dsu2,v);
}
int n=0;
int a[N]={};
vector<int> ans[N];
int k=0,cnt=0;
int ii=1,jj=1;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		dsu1[i]=i;
		dsu2[i]=i;
	}
	for(int i=2;i<=n;i++){
		if(a[i]==a[i-1]){
			unite2(i-1,i);
		}
	}
	for(int i=n+1;i<N;i++){
		dsu1[i]=i;
		dsu2[i]=i;
	}
	while(cnt<n){
		k++;
		ii=1;
		jj=1;
		while(ii<=n&&cnt<n){
			jj=getfather(dsu1,ii);
			if(jj==getfather(dsu2,jj)){
				if(!vis[jj]&&jj<=n){
					vis[jj]=1;
					ans[k].push_back(jj);
					cnt++;
					if(jj<n&&a[jj+1]==a[jj]){
						unite1(jj,jj+1);
					}
					else if(getfather(dsu2,jj+1)+1<n){
						unite1(jj,getfather(dsu2,jj+1)+1);
					}
					//cout<<ii<<" "<<jj<<"***"<<endl;
					if(jj<n&&ii>1){
						unite2(ii-1,jj+1);
					}
				}
			}
			else{
				if(!vis[jj]&&jj<=n){
					vis[jj]=1;
					ans[k].push_back(jj);
					cnt++;
					if(jj<n&&a[jj+1]==a[jj]){
						unite1(jj,jj+1);
					}
					else if(getfather(dsu2,jj+1)+1<n){
						unite1(jj,getfather(dsu2,jj+1)+1);
					}
				}
			}
			ii=getfather(dsu2,ii)+1;
		}
	}
	for(int i=1;i<=k;i++){
		if(ans[i].empty()){
			break;
		}
		for(int j=0;j<ans[i].size();j++){
			cout<<ans[i][j]<<" ";
		}
		cout<<endl;
	}
	return 0;
}
2024/9/25 01:21
加载中...