luogu_P2757 [国家集训队]等差子序列

https://www.luogu.org/problem/P2757

题目描述

给一个1到N的排列{Ai},询问是否存在

1 \le p_1<p_2<p_3<p_4<p_5<…<p_{Len} \le N (Len \ge 3)1p1<p2<p3<p4<p5<<pLenN(Len3)

使得Ap_1,Ap_2,Ap_3,\cdots,Ap_{Len}Ap1,Ap2,Ap3,,ApLen是一个等差序列。

输入格式

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

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

输出格式

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

输入输出样例

输入 #1
2
3
1 3 2
3
3 2 1
输出 #1
N
Y

说明/提示

对于5%的数据,N<=100

对于30%的数据,N<=1000

对于100%的数据,N<=10000,T<=7


 

等差数列x,y,z,则x与z关于y对称,利用bitset对比

第一次写bitset,太毒瘤了

#include<iostream>
#include<cstdio>

#define ri register int
#define u int

namespace opt {

    inline u in() {
        u x(0),f(1);
        char s(getchar());
        while(s<'0'||s>'9') {
            if(s=='-') f=-1;
            s=getchar();
        }
        while(s>='0'&&s<='9') {
            x=(x<<1)+(x<<3)+s-'0';
            s=getchar();
        }
        return x*f;
    }

}

using opt::in;

#include<bitset>
#include<algorithm>

#define NN 10005

namespace mainstay {

    using std::bitset;

    typedef bitset<NN> bit;

    bit e1,e2,bas;

    u check(u x,const u &N) {
        if(x<=N/2) {
            bit _t1((bas>>(N-x))&(e1));
            _t1.set(0);
            bit _t2((bas>>(N-x))&(e2>>(N-2*x+1)));
            _t2.set(0);
            if(_t1!=_t2) return 1;
            else return 0;
        } else {
            bit _t1(e1>>(x-1));
            _t1.set(0);
            bit _t2((bas>>(x-1))&(e2>>(N-x)));
            _t2.set(0);
            if(_t1!=_t2) return 1;
            else return 0;
        }
    }

    inline void solve() {
        u T(in());
        while(T--) {
            u N(in()),flg(0);
            e1.reset(),e2.reset(),bas.reset();
            for(ri i(1); i<=N; ++i) bas.set(i);
            for(ri i(1); i<=N; ++i) {
                u _a(in());
                e1.set(_a),e2.set(N+1-_a);
                if(check(_a,N)) flg=1;
            }
            if(flg) printf("Y\n");
            else printf("N\n");
        }
    }

}

int main() {

    //freopen("x.txt","r",stdin);
    std::ios::sync_with_stdio(false);
    mainstay::solve();

}

 

posted @ 2019-10-30 17:07  pai_hoo  阅读(169)  评论(0编辑  收藏  举报