1. 程式人生 > >Codevs 1283 等差子序列

Codevs 1283 等差子序列

desc ref ger -o i++ div const pad hint

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\n"); else printf("N\n"); } }
75分 O(n2)暴力

Codevs 1283 等差子序列