bzoj 2124 等差子串行

2021-08-22 13:21:58 字數 1352 閱讀 5077

description

給乙個1到n的排列,詢問是否存在1<=p1< p2< p3< p4< p5< …< plen<=n (len>=3),

使得ap1,ap2,ap3,…aplen是乙個等差序列。

input

輸入的第一行包含乙個整數t,表示組數。

下接t組資料,每組第一行乙個整數n,每組第二行為乙個1到n的排列,數字兩兩之間用空格隔開。

n<=10000,t<=7

output

對於每組資料,如果存在乙個等差子串行,則輸出一行「y」,否則輸出一行「n」。

sample input

2 3

1 3 2

3 3 2 1

sample output

n y

hint

source

利用乙個i性質 因為是排列 所以 每個數字只會出現一次 因為要求長度》=3即可 所以我們直接求一下長度=3是否存在即可 我們一邊做一邊檢查是否左右兩邊是回文串 就是檢查數值的兩邊即可

一旦遇到不是回文串了說明肯定就可以滿足條件了 畢竟我們i只需要三個 我列舉中間的點 然後算兩邊即可 具體hash可以用樹狀陣列維護 看**即可

#include

#define ll long long

using

namespace

std;

inline

char gc()

return *s++;

}inline

int read()

while(isdigit(ch)) x=x*10+ch-'0',ch=gc();

return x*f;

}const

int n=1e5+10;

const

int g=11117;

const

int mod=1e9+7;

int n,a[n],t,p[n];

inline

int inc(int x,int v)

inline

int dec(int x,int v)

struct node

inline

void add(int x)

inline

int qs(int x)

inline

int qr(int x,int y)

}t1,t2;

int main()

t1.add(a[i]);t2.add(n-a[i]+1);

}if (flag) puts("y");else

puts("n");

}return

0;}

BZOJ2124 等差子串行

挺厲害的題 我們考慮當前加入了第i個數,為x,那麼我們可以維護一下哪個數出現過,出現過為1,沒出現為0,那麼加入x的時候我們只需要判斷以x為中心的極長子串是否是回文串即可 用乙個樹狀陣列維護兩個方向的雜湊值即可 include include include include include incl...

BZOJ 2124 等差子串行

給乙個1到n的排列,詢問是否存在 3 plen 使得ap1,ap2,ap3,aplen是乙個等差序列。輸入的第一行包含乙個整數t,表示組數。下接t組資料,每組第一行乙個整數n,每組第二行為乙個1到n的排列,數字兩兩之間用空格隔開。對於每組資料,如果存在乙個等差子串行,則輸出一行 y 否則輸出一行 n...

bzoj2124 等差子串行

傳送門 題目 給乙個1到n的排列,詢問是否存在1 p1 3 使得ap1,ap2,ap3,aplen是乙個等差序列。input 輸入的第一行包含乙個整數t,表示組數。下接t組資料,每組第一行乙個整數n,每組第二行為乙個1到n的排列,數字兩兩之間用空格隔開。n 10000,t 7 output 對於每組...