题解 P1053 【篝火晚会】

· · 题解

#include<iostream>
using namespace std;
int ans,x[500001],y[500001],n,s[500001],a[500001],b[500001],l1,l2;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>x[i]>>y[i];
// ————————一条华丽的手动分割线———————— 
    s[1]=1; s[n]=x[1]; s[2]=y[1];
    for(int i=3;i<=n-1;i++)
        if(x[s[i-1]]==s[i-2]) s[i]=y[s[i-1]];
        else s[i]=x[s[i-1]];
// 建环,估计也只有我zz的错了这个。。。然后想了半天
// ps(一句废话):问大佬被大佬鄙视了半天。。。 
// —————————————————————————— 
    for(int i=1;i<=n;i++)
    {
        l1=i-1;l2=i+1;
        if(l1<1) l1=n;
        if(l2>n) l2=1;
        if((s[l1]!=x[s[i]] || s[l2]!=y[s[i]]) && (s[l2]!=x[s[i]] || s[l1]!=y[s[i]]))
        {
            cout<<"-1";
            return 0;
        }
    }
// 判断是不是成环了。。。
//可以在这步同时求出有多少个不符合位置的人,直接出结果
// dalao可以try一try。。。 
// ——————————————————————————
    for(int i=1;i<=n;i++)
    {
        a[(s[i]-i+n)%n]++;
        b[(s[i]+i-1)%n]++;
    }
// o(n)做法。。。烧脑。。。 
    for(int i=0;i<=n-1;i++)
    {
        if(ans<a[i]) ans=a[i];
        if(ans<b[i]) ans=b[i];
    }
    cout<<n-ans;
}