Codevs 1283 等差子序列
题目描述 Description
给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len>=3),使得 Ap1,Ap2,Ap3,…ApLen 是一个等差序列。
输入描述 Input Description
输入的第一行包含一个整数 T,表示组数。
下接 T 组数据,每组第一行一个整数 N,每组第二行为一个 1 到 N 的排列, 数字两两之间用空格隔开。
输出描述 Output Description
对于每组数据,如果存在一个等差子序列,则输出一行“Y”,否则输出一 行“N”。
样例输入 Sample Input
2
3
1 3 2
3
3 2 1
样例输出 Sample Output
N
Y
数据范围及提示 Data Size & Hint
对于5%的数据,N<=100,对于30%的数据,N<=1000,对于100%的数据,N<=10000,T<=7
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/* 从数列中O(n)找一个mid,枚举他前面的每个数,记录下差 再枚举mid后面的数,如果差记录过,则存在等差数列 */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=10010; int T,n,a[maxn]; int vis[maxn<<4]; int main(){ scanf("%d",&T); while(T--){ scanf("%d",&n); bool flag=0; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=2;i<=n;i++){ for(int j=1;j<i;j++) vis[a[i]-a[j]+10010]=i; for(int j=i+1;j<=n;j++){ if(vis[a[j]-a[i]+10010]==i)flag=1; if(flag)break; } if(flag)break; } if(flag)printf("Y\n"); else printf("N\n"); } }