社区讨论

打了2小时

P1053[NOIP 2005 提高组] 篝火晚会参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi6hi5g4
此快照首次捕获于
2025/11/20 04:58
4 个月前
此快照最后确认于
2025/11/20 04:58
4 个月前
查看原帖
CPP
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
int n,a[50002],b[50002],t[50002],f[50002],ans=1e9;
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    scanf("%d%d",&a[i],&b[i]);
    for (int i=1;i<=n;i++)
    if (a[a[i]]!=i && b[a[i]]!=i || a[b[i]]!=i && b[b[i]]!=i)
    {printf("-1");return 0;}//判断是否合法
    t[1]=1;t[2]=a[1];//方案1
    for (int i=2;i<n;i++)
    if (a[t[i]]==t[i-1])t[i+1]=b[t[i]];
    else t[i+1]=a[t[i]];
    for (int i=1;i<=n;i++)
    f[(i-t[i]+1)>0?(i-t[i]+1):(n-(t[i]-i)+1)]++;
    for (int i=1;i<=n;i++)
    ans=min(ans,n-f[i]);
    memset(t,0,sizeof(t));memset(f,0,sizeof(f));
    t[1]=1;t[2]=b[1];//方案2
    for (int i=2;i<n;i++)
    if (a[t[i]]==t[i-1])t[i+1]=b[t[i]];
    else t[i+1]=a[t[i]];
    for (int i=1;i<=n;i++)
    f[(i-t[i]+1)>0?(i-t[i]+1):(n-(t[i]-i)+1)]++;
    for (int i=1;i<=n;i++)
    ans=min(ans,n-f[i]);
    printf("%d",ans);
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...