Codevs 1283 等差子序列
阿新 • • 發佈:2017-08-08
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 Input2
3
1 3 2
3
3 2 1
樣例輸出 Sample OutputN
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(75分 O(n2)暴力"%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"); } }
Codevs 1283 等差子序列