BZOJ 2124 等差子串行

2022-03-27 09:58:30 字數 1428 閱讀 5415

給乙個1到n的排列,詢問是否存在(3<=plen),使得ap1,ap2,ap3,…aplen是乙個等差序列。

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

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

1 3 2

3 2 1ny

神題神思路= =

我們用$01$串代表某個值是否出現過,然後$hash$

對於每次出現的$a[i]$,我們找出向左與向右最長相等長度的$01$串的$hash$值,

判斷一下是否相等,如果相等,說明$a[i]-x$與$a[i]+x$在$a[i]$的同側,就不可能出現長度為$3$的等差數列

線段樹瞎$xx$維護一下就好了

1 #include2 #include3 #include4

using

namespace

std;

5 inline int

read()

12 typedef long

long

l;13

const

int p=3;14

const

int mod=1000000007

;15 l xp[10005

];16 l has1[40005],has2[40005

];17

int a[10005

];18 inline void pushup(int i,int

len)

23 inline void update(int pos,int l,int r,int

i)28

int mid((l+r)>>1

);29

if(pos<=mid)

30 update(pos,l,mid,i<<1

);31

else

32 update(pos,mid+1,r,i<<1|1

);33 pushup(i,r-l+1

);34

}35 inline l query1(int ll,int rr,int l,int r,int

i)47 inline l query2(int ll,int rr,int l,int r,int

i)59

intmain()

78 update(a[i],1,n,1

);79}80

if(flag)

81 puts("y"

);82

else

83 puts("n"

);84

}85 }

view code

BZOJ2124 等差子串行

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

bzoj 2124 等差子串行

description 給乙個1到n的排列,詢問是否存在1 p1 p2 p3 p4 p5 plen n len 3 使得ap1,ap2,ap3,aplen是乙個等差序列。input 輸入的第一行包含乙個整數t,表示組數。下接t組資料,每組第一行乙個整數n,每組第二行為乙個1到n的排列,數字兩兩之間用...

bzoj2124 等差子串行

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