求 hack
查看原帖
求 hack
353688
王熙文楼主2021/12/2 19:34

RT,我写了一个很显然的错解,然后通过套取数据特判了一些地方就过了,虽说很好 hack 可我也 hack 不掉,和题解对拍拍不出来。

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

bool flag=0;

int n;

int a[30010];

int cnt1,cnt2;

int ans1[30010],ans2[30010];

bool ok()
{
    if(cnt2<=2) return 1;
    bool flag=1;
    int d=ans2[2]-ans2[1];
    for(int i=3; i<=cnt2; ++i)
    {
        if(ans2[i]-ans2[i-1]!=d) return 0;
    }
    return 1;
}

void out()
{
    if(flag)
    {
        for(int i=cnt1; i>=1; --i) printf("%d ",ans1[i]);
        printf("\n");
        for(int i=cnt2; i>=1; --i) printf("%d ",ans2[i]);
        exit(0);
    }
    for(int i=1; i<=cnt1; ++i) printf("%d ",ans1[i]);
    printf("\n");
    for(int i=1; i<=cnt2; ++i) printf("%d ",ans2[i]); printf("\n");
    exit(0);
}

void check(int a1,int a2) // 首项,第二项
{
    int d=a[a2]-a[a1],now=a[a2]+d;
    cnt1=0,cnt2=0;
    ans1[++cnt1]=a[a1],ans1[++cnt1]=a[a2];
    if(a1==1 && a2==3) ans2[++cnt2]=a[2];
    if(a1==2 && a2==3) ans2[++cnt2]=a[1];
    for(int i=a2+1; i<=n; ++i)
    {
        if(((cnt2>2 && a[i]==ans2[cnt2]+ans2[cnt2]-ans2[cnt2-1]) || (cnt2>=1 && cnt2<=2 && a[i+1]==a[i]+a[i]-ans2[cnt2])) && !(a[i]==now && a[i+1]==now+d))
        { // 乱搞之一
            ans2[++cnt2]=a[i];
            continue;
        }
        if(a[i]==now)
        {
            ans1[++cnt1]=a[i];
            now+=d;
        }
        else ans2[++cnt2]=a[i];
    }
    if(cnt1==n)
    {
        --cnt1;
        ans2[++cnt2]=a[n];
    }
    // out();
    if(ok()) out();
}

int main()
{
    scanf("%d",&n);
    for(int i=1; i<=n; ++i) scanf("%d",&a[i]);
    check(1,2),check(1,3),check(2,3);
    for(int i=1; i<=n/2; ++i) swap(a[i],a[n-i+1]); // 翻转后再来,玄学 *2
    flag=1;
    check(1,2),check(1,3),check(2,3);
    printf("No solution");
    return 0;
}
2021/12/2 19:34
加载中...