链表0分求助
查看原帖
链表0分求助
556362
Unnamed114514楼主2021/11/6 10:05
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int n,cnt,k,now,father[maxn],fa1[maxn],fa2[maxn],s1[maxn],s2[maxn];
bool p[maxn];
int findSet(int x){
	if(father[x]==x)
		return x;
	return father[x]=findSet(father[x]);
}
int main(){
	scanf("%d",&n);
	memset(fa1,-1,sizeof(fa1));
	memset(fa2,-1,sizeof(fa2));
	memset(s1,-1,sizeof(s1));
	memset(s2,-1,sizeof(s2));
	for(int i=1;i<=n;i++)
		scanf("%d",&p[i]);
	for(int i=1;i<=n;i++){
		father[i]=i;
		if(i==1)
			k=i;
		else{
			if(p[i]==p[i-1])
				s1[i-1]=i,fa1[i]=i-1;
			else
				s2[k]=i,fa2[i]=k,k=i;
		}
	}
	while(cnt<n){
		int k=findSet(1);
		while(k!=-1){
			if(k==-1)
				break;
			printf("%d ",k),cnt++;
			father[findSet(k)]=findSet(k+1);
			if(s1[k]==-1){
				fa2[s2[k]]=-1;
				s2[fa2[k]]=-1;
				fa1[s2[k]]=fa2[k];
				s1[fa2[k]]=s2[k];
			} else{
				fa2[s2[k]]=s1[k];
				s2[fa2[k]]=s1[k];
				fa2[s1[k]]=fa2[k];
				s2[s1[k]]=s2[k];
			}
			k=s2[k];
		}
		puts("");
	}
	return 0;
}
2021/11/6 10:05
加载中...