关于标签
查看原帖
关于标签
658786
STUDENT00楼主2022/10/17 21:56

真“模拟”,这题还是很有思维含量的啊!

#include<bits/stdc++.h>
using namespace std;
int n,a[50010][2],v[50010],ans=1e9;
void f(){
	int num[50010]={0};
	for(int i=1;i<=n;i++) num[(v[i]-i+n)%n]++;
	for(int i=0;i<n;i++) ans=min(ans,n-num[i]);
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d%d",&a[i][0],&a[i][1]);
	for(int i=1;i<=n;i++){
		if(a[a[i][0]][0]!=i&&a[a[i][0]][1]!=i||a[a[i][1]][0]!=i&&a[a[i][1]][1]!=i){
			printf("-1");
			return 0;
		}
	}
	int k=3,x=1,y=a[1][0];
	v[1]=x;
	v[2]=y;
	while(k<=n){
		if(a[y][0]==x){
			v[k]=a[y][1];
			x=y;
			y=v[k];
		}else{
			v[k]=a[y][0];
			x=y;
			y=v[k];
		}
		k++;
	}
	f();
	k=3,x=1,y=a[1][1];
	v[1]=x;
	v[2]=y;
	while(k<=n){
		if(a[y][0]==x){
			v[k]=a[y][1];
			x=y;
			y=v[k];
		}else{
			v[k]=a[y][0];
			x=y;
			y=v[k];
		}
		k++;
	}
	f();
	printf("%d",ans);
	return 0;
}
2022/10/17 21:56
加载中...