[bzoj2124]等差子串行
試題描述
給乙個1到n的排列,詢問是否存在1<=p_1=3),使得ap_1,ap_2,ap_3,…ap_len是乙個等差序列。
輸入
輸入的第一行包含乙個整數t,表示組數。下接t組資料,每組第一行乙個整數n,每組第二行為乙個1到n的排列,數字兩兩之間用空格隔開。
輸出
對於每組資料,如果存在乙個等差子串行,則輸出一行「y」,否則輸出一行「n」。
輸入示例
2313233
21
輸出示例
ny
資料規模及約定
對於100%的資料,n<=10000,t<=7
題解
注意輸入的是乙個排列,所以不會有重複的數字,也就是它出現了一次之後就不會再出現了。
於是我們考慮從前往後加入每個數;令 b[i] 表示數字 i 當前是否被加入,當加入數字 x 時,我們把 b[x] 設為 1,然後看一下 b 陣列中以 x 為中心的極長子區間是不是乙個回文串,如果不是則說明找到了乙個長度為 3 的等差數列。為什麼呢?考慮 x 左邊的某個數 y 如果是 0(即它還沒有被插入,也就是它是在原排列中 x 的後面出現的),那麼只要 2x - y 的位置是 1(即它在 x 的前面出現),那麼 就構成了乙個等差數列。
那麼我們維護 b 陣列的區間正反雜湊值就好了。
#include #include #include #include #include #include using namespace std;int read()
while(isdigit(c))
return x * f;
}#define maxn 10010
#define ul unsigned long long
int n;
ul h1[maxn<<2], h2[maxn<<2], idx[maxn];
ul query1(int o, int l, int r, int ql, int qr)
ul query2(int o, int l, int r, int ql, int qr)
void update(int o, int l, int r, int x)
return ;
}int main()
puts(ok ? "y" : "n"); }
return 0;
}
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...