题目描述 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
题意:这题因为是一个n的序列,所以数列的数都是1<=x<=n的,所以可以用一个01字符串定于哪位来表示这个数是否出现过,输的当前数,这个位肯定是1,然后以这位为中心,判断两边等距离的数是否异或为1,如果为1说明这个等差数列的缺省数会在后面给出,所以肯定包含等差子序列啦!
这题用上bitset后就方便多了,不懂这个的看了这个网址之后就明白了:http://baike.baidu.com/view/2479473.htm?fr=aladdin
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<bitset>
using namespace std;
bitset<10005>b;
int main()
{
int t,n,a;
cin>>t;
while(t--)
{
scanf("%d",&n);
b.reset();
int flag=0,m=n;
while(m--)
{
scanf("%d",&a);
if(flag) continue;
b.set(a);
for(int i=a-1;i;i--)
{
int j=a*2-i;
if(j>n) break;
if(b.test(i)^b.test(j))
{
flag=1;
break;
}
}
}
if(flag) puts("Y");
else puts("N");
}
return 0;
}