bzoj2124 等差子串行

2022-05-02 03:48:06 字數 1313 閱讀 3757

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

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

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

1 3 2

33 2 1ny

對於100%的資料,n<=10000,t<=7

正解:樹狀陣列+$hash$。

超級神題系列。。

這道題實際上是問能否找到一組$j考慮列舉中間的那個$i$,我們要找到乙個公差$x$,使得$a[i]-x$出現過,而$a[i]+x$沒有出現過。

那麼維護乙個陣列$b$,$b[i]=1$表示$i$出現過,否則沒有出現過,於是只要有$b[a[i]-x]!=b[a[i]+x]$就行了。

考慮把$b$變成乙個字串,那麼如果以$x$為中心的極長串不是回文串,那麼就有一組合法情況。

那麼我們維護乙個正的字串和反的字串,因為有單點修改,所以我們用樹狀陣列維護字串的$hash$值就行了。

查詢的時候直接比較$a[i]$的左邊串和右邊的倒串是否相等即可。

1 #include 2

#define il inline

3#define rg register

4#define ll long long

5#define ull unsigned long long

6#define n (100010)

7#define lb(x) (x & -x)89

using

namespace

std;

1011

inta[n],n,fg;

12ull bin[n];

1314 il int

gi()

2122

struct

bit27

28 il void add(rg int

x)31

32 il ull query(rg int

x)35

36 il ull calc(rg int l,rg int

r)40

41}bit1,bit2;

4243 il void

work()

49 bit1.add(a[i]),bit2.add(n-a[i]+1

);50

}51 puts(fg ? "

y" : "

n"); return;52

}5354int

main()

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的排列,數字兩兩之間用...

BZOJ 2124 等差子串行

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