BZOJ2124 等差子串行

2022-06-02 19:15:14 字數 1219 閱讀 5758

time limit: 3 sec  memory limit: 259 mb submit: 1504  solved: 548 [submit][status][discuss]

給乙個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

考慮插入並列舉每個數為等差中項,如果序列不存在等差數列,那麼在它前面所有出現的數中,任意乙個可能存在對應數的數都能找到對應的數,否則對應的數一定會出現在後面(因為是$1$到$n$的排列),所以可以考慮維護乙個權值線段樹,如果乙個數出現過就標記為1,然後支援查詢區間雜湊值(正反)就行了

#include #include 

#include

using

namespace

std;

char buf[10000000], *ptr = buf - 1

;inline

intreadint()

returnn;}

typedef unsigned

long

long

ull;

const

int maxn = 10000 + 10

;#define lson l, mid, rt << 1

#define rson mid + 1, r, rt << 1 | 1ull h1[maxn

<< 2], h2[maxn << 2

], pow[maxn];

void update(int w, int l, int r, int

rt)}

ull query1(

int ql, int qr, int l, int r, int

rt)}

ull query2(

int ql, int qr, int l, int r, int

rt)}

intmain()

puts(flag ? "

y" : "n"

); }

return0;

}

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...