wikioi 1283 等差子序列(bitset 01位的巧妙使用)

给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len>=3),使得 Ap1,Ap2,Ap3,…ApLen是一个等差序列。

输入的第一行包含一个整数 T,表示组数。

 下接 T 组数据,每组第一行一个整数 N,每组第二行为一个 1 到 N 的排列, 数字两两之间用空格隔开。

对于每组数据,如果存在一个等差子序列,则输出一行“Y”,否则输出一 行“N”。

2

3

1 3 2

3

3 2 1

N

Y

对于5%的数据,N<=100对于30%的数据,N<=1000对于100%的数据,N<=10000T<=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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值