P7205 Drvca 题解

· · 题解

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10;
int n,val[N],L[N],R[N];
bool st[N];
map<int,int> mp;
inline bool check(int a,int b)
{   
    mp.clear();
    memset(L,0,sizeof L);
    memset(R,0,sizeof R);
    memset(st,0,sizeof st);
    st[a]=st[b]=true;
    int last=0,cnt=2;
    for(int i=1;i<=n;i++)
    {
        if(st[i])   continue;
        if(last)    mp[val[i]-val[last]]++;
        L[i]=last,R[last]=i;
        last=i;
    }
    if((int)mp[val[R[R[0]]]-val[R[0]]]==n-cnt-1)    return true;
    last=b;
    for(int i=1;i<=n;i++)
    {
        if(st[i]||val[i]-val[last]!=val[b]-val[a])  continue;
        if(L[i])    mp[val[i]-val[L[i]]]--;
        if(R[i])    mp[val[R[i]]-val[i]]--;
        if(L[i]&&R[i])  mp[val[R[i]]-val[L[i]]]++;
        R[L[i]]=R[i];L[R[i]]=L[i];
        cnt++;last=i;st[i]=true;
        if((int)mp[val[R[R[0]]]-val[R[0]]]==n-cnt-1)    return true;
    }
    return false;
}
inline void print()
{
    int num=0;
    for(int i=1;i<=n;i++)   if(st[i])   num++;
    printf("%d\n",num);
    for(int i=1;i<=n;i++)   if(st[i])   printf("%d ",val[i]);
    printf("\n%d\n",n-num);
    for(int i=1;i<=n;i++)   if(!st[i])  printf("%d ",val[i]);
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)   scanf("%d",&val[i]);
    sort(val+1,val+n+1);
    if(n==2)    printf("1\n%d\n1\n%d",val[1],val[2]);
    else if(check(1,2)||check(1,3)||check(2,3)) print();
    else printf("-1");
    return 0;
}