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;
}