我是傻逼啊!十几年前的noip题都不会!
题解不写了,当时参考了下面的博客。
http://blog.csdn.net/FSAHFGSADHSAKNDAS/article/details/49529773
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define rep(i,j,k) for(i=j;i<=k;++i)
#define per(i,j,k) for(i=j;i>=k;--i)
#define ll long long
#define db double
#define mkp(x,y) make_pair(x,y)
#define pii pair<int,int>
#define X first
#define Y second
const int N=50005;
int n,a[N],b[N],c[N],d[N],e[N],ans;
int main(){
int i,x,y;
scanf("%d",&n);
rep(i,1,n)scanf("%d%d",&a[i],&b[i]);
c[1]=1;c[2]=b[1];
rep(i,2,n){
if(a[c[i]]!=c[i-1])swap(a[c[i]],b[c[i]]);
if(a[c[i]]!=c[i-1]){puts("-1");return 0;}
c[i+1]=b[c[i]];
}
if(a[1]!=c[n]||c[n+1]!=1){puts("-1");return 0;}
rep(i,1,n){
d[c[i]]=i-c[i];
if(d[c[i]]<0)d[c[i]]+=n;
++e[d[c[i]]];
}
ans=n-1;
rep(i,0,n-1)ans=min(ans,n-e[i]);
reverse(c+1,c+n+1);
memset(e,0,sizeof e);
rep(i,1,n){
d[c[i]]=i-c[i];
if(d[c[i]]<0)d[c[i]]+=n;
++e[d[c[i]]];
}
rep(i,0,n-1)ans=min(ans,n-e[i]);
printf("%d\n",ans);
return 0;
}