记录编号 |
463780 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2005]篝火晚会 |
最终得分 |
100 |
用户昵称 |
TARDIS |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.129 s |
提交时间 |
2017-10-24 19:27:36 |
内存使用 |
3.24 MiB |
显示代码纯文本
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=100010;
int val[maxn],cnt[maxn];
int pos[maxn],l[maxn],r[maxn];
int beside[maxn][2];
int n,m,k,ans;
void beg(){
freopen("fire.in","r",stdin);
freopen("fire.out","w",stdout);
}
int main(){
beg();
scanf("%d",&n);
for (int i=1;i<=n;i++){
for (int j=0;j<2;j++){
scanf("%d",&beside[i][j]);
cnt[beside[i][j]]++;
}
}
for (int i=1;i<=n;i++){
if (cnt[i]!=2){
puts("-1");
return 0;
}
}
l[1]=beside[1][0];
r[1]=beside[1][1];
int pos_now=1,cnt_temp=0;
do{
int y=r[pos_now];
l[y]=pos_now;
if (beside[y][0]==pos_now) r[y]=beside[y][1];else r[y]=beside[y][0];
pos_now=y;
cnt_temp++;
}while (pos_now!=1);
if (cnt_temp!=n){
printf("-1");
return 0;
}
int s[maxn];memset(s,0,sizeof(s));
for (int i=1,p=1;i<=n;i++,p=r[p]){
s[(i-p+n)%n]++;
ans=max(s[(i-p+n)%n],ans);
}
memset(s,0,sizeof(s));
for (int i=1,p=1;i<=n;i++,p=l[p]){
s[(i-p+n)%n]++;
ans=max(ans,s[(i-p+n)%n]);
}
printf("%d",n-ans);
return 0;
}