• 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
    ");
                else printf("N
    ");
            }
        }
    
    }
    
    int main() {
    
        //freopen("x.txt","r",stdin);
        std::ios::sync_with_stdio(false);
        mainstay::solve();
    
    }
  • 相关阅读:
    MySQL之事务
    TP5之查询那些事
    TP5之上传多张图片
    PhpStorm之设置字体大小
    Git入门
    TP5之自定义分页样式
    TP之安全机制
    Navicat Premium连接服务器数据库
    IEnumerable 与 IEnumerable<T>
    关于递归
  • 原文地址:https://www.cnblogs.com/ling-zhi/p/11766136.html
Copyright © 2020-2023  润新知