Codevs 1283 等差子序列

1283 等差子序列

 

2010年

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 大师 Master
 
 
 
题目描述 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

/*
    从数列中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
");
        else printf("N
");
    }
}
75分 O(n2)暴力
原文地址:https://www.cnblogs.com/thmyl/p/7308928.html