求助 ABC G 题,3关
  • 板块学术版
  • 楼主ACPC
  • 当前回复7
  • 已保存回复7
  • 发布时间2024/9/14 21:40
  • 上次更新2024/9/15 09:27:40
查看原帖
求助 ABC G 题,3关
540363
ACPC楼主2024/9/14 21:40

https://atcoder.jp/contests/abc371/submissions/57783392

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fr first
#define sc second
int read(){
	int res=0,f=1;char c=getchar();
	while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
	while (c>='0'&&c<='9') {res=res*10+(c-'0');c=getchar();}
	return res*f;
}
const int N=2e5+5;
int n=read(),a[N],b[N],g,c[N];
int fa[N],siz[N],vis[N];
vector<int>e[N];
int find(int x){
	if (fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
signed main(){
	for (int i=1;i<=n;i++)
		fa[i]=i,siz[i]=1;
	for (int i=1;i<=n;i++){
		a[i]=read();
		int x=find(i),y=find(a[i]);
		if (x!=y) fa[x]=y,siz[y]+=siz[x];
	}
	for (int i=1;i<=n;i++)
		b[i]=read();
	g=siz[find(1)];
	for (int i=2;i<=n;i++)
		g=__gcd(g,siz[find(i)]);
	for (int i=1;i<=n;i++){
		if (vis[find(i)])
			continue;
		int x=i,cc=0;
		do{
			c[x]=cc++;
			e[find(i)].push_back(b[x]),x=a[x];
		}while (x!=i);
		vis[find(i)]=1;
	}
	for (int i=1;i<=n;i++)
		vis[i]=0;
	int mn=1e18,id=-1;
	for (int i=0;i<(int)e[find(1)].size();i++)
		if (e[find(1)][i]<mn) mn=e[find(1)][i],id=i;
	vector<int>_e;
	for (int i=id;i<(int)e[find(1)].size();i++)
		_e.push_back(e[find(1)][i]);
	for (int i=0;i<id;i++)
		_e.push_back(e[find(1)][i]);
	e[find(1)]=_e;
	vis[find(1)]=1;
	id%=g;
	for (int i=1;i<=n;i++){
		int x=find(i),_mn=1e18,_id=-1;
		if (vis[x]) continue;
		for (int i=0;i<(int)e[x].size();i+=g)
			if (e[x][(i+id)%e[x].size()]<_mn)
				_mn=e[x][(i+id)%e[x].size()],_id=i;
		_e.clear();
		for (int i=_id;i<(int)e[x].size();i++)
			_e.push_back(e[x][(i+id)%e[x].size()]);
		for (int i=0;i<_id;i++)
			_e.push_back(e[x][(i+id)%e[x].size()]);
		e[x]=_e;vis[x]=1;
	}
	for (int i=1;i<=n;i++)
		cout<<e[find(i)][c[i]]<<' ';
	return 0;
}
2024/9/14 21:40
加载中...