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)1≤p1<p2<p3<p4<p5<…<pLen≤N(Len≥3)
使得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(); }