感謝孫耀峰的線段樹ppt,使我獲益匪淺.
b zo
j−
2124
bzoj-2124
bzoj−2
124給出長度為n
nn的1−n
1-n1−
n的排列a
aa問是否存在一組1≤p
1≤p2
≤...
≤pl≤
n,l≥
31 \le p_1 \le p_2 \le ... \le p_l \le n,l \ge 3
1≤p1≤
p2≤
...≤
pl≤
n,l≥
3使得ap1
,ap2
,...
,apl
a_,a_,...,a_
ap1,a
p2,
...,
apl
構成等差序列
資料範圍n≤1
04
n \le 10^4
n≤10
4只要能形成長度為3
33的等差子串行,就直接輸出yes
yesye
s即可.
即需要尋找i,j
,k
i,j,k
i,j,
k滿足ai=
aj−t
,ak=
aj+t
,且
t>
0.a_i = a_j - t,a_k = a_j + t,且t > 0.
ai=aj
−t,
ak=
aj+
t,且t
>0.
根據轉化後的式子,我們只需要列舉j
jj,判斷是否存在這樣的t
tt即可.
考慮到a
aa是乙個排列,排列中的數兩兩不同,因此我們可以考慮開乙個資料結構維護一下內容:
當列舉到a
ja_j
aj的時候,我可以很快的查詢任何乙個a
ia_i
ai在a
ja_j
aj的左邊還是右邊,(記如果i
ija_j
aj應該標記為0
00表示在左邊,若i
>
ji>j
i>j則a
ja_j
aj應該標記為1
11表示在右邊).
這樣的話,如果01
0101
串[ aj
−t,a
j−1]
[a_j-t,a_j-1]
[aj−t
,aj
−1]與[aj
+1,a
j+t]
[a_j+1,a_j+t]
[aj+1
,aj
+t]之間有一位不相同(也就是說存在關於a
ja_j
aj的對稱位置的兩個數在a
ja_j
aj兩側,說明可以形成等差子串行).
因此只有當以上兩個01串,翻轉過來完全相同的情況下,才不存在以a
ja_j
aj作為中心的等差序列.
如何判斷01
0101
串相同呢?答案是雜湊.
建立一顆線段樹,維護的是01
0101
串的正向和反向雜湊值.
從小到大列舉aj,
[1,n
]a_j,[1,n]
aj,[1
,n],然後更新線段樹,並判斷是否有以a
ja_j
aj為對稱中心的等差序列.
#include
#include
const
int n =
10007
;typedef
unsigned
long
long ull;
int t,n;
int a[n];
ull pow[n]
;struct work
;#define pr(x) std::cout << #x << ": " << x << std::endl
struct segtree
void
change
(int rt,
int l,
int r,
int pos,
int val)
int mid =
(l + r)/2
;if(pos > mid)
change
(rt*2+
1,mid+
1,r,pos,val)
;else
change
(rt*
2,l,mid,pos,val)
;maintain
(rt,l,r);}
work query
(int rt,
int l,
int r,
int ql,
int qr);}
else
if(ql <= l && r <= qr);}
int mid =
(l + r)/2
; work wa =
query
(rt*
2,l,mid,ql,qr)
; work wb =
query
(rt*2+
1,mid+
1,r,ql,qr)
;return
(work);}
}seg;
intmain()
}if(!f)
std::cout <<
"n"<< std::endl;
else
std::cout <<
"y"<< std::endl;
}return0;
}
BZOJ 2124 等差子串行 線段樹 hash
題目傳送門 等等 這題好像在 做過 哦,codeforces 452f,原題哈 為什麼我還是不會做啊 就當是複習一遍吧,這種想法還是挺好的。p.s.wa了兩發,錯在了updata上 好像updata這個地方好容易出錯啊。附上ac include include include using names...
BZOJ2124 等差子串行 線段樹 hash
傳送門 給出乙個n的排列,問是否存在乙個長度至少為3的等差子串行 n 10000 注意到我們給出的是乙個排列,而且我們只需要找長度為3的子串行即可 那麼我們可以列舉中間項x,用01串s和t來表示x前面的數中 1,x 1 和 x 1,x x 1 是否出現,每次判斷串s和t的反串是否相等即可,如果不相等...
BZOJ 2124等差子串行 線段樹 hash
題目描述 description 給乙個 1 到 n 的排列,詢問是否存在 1 p1 3 使得 ap1,ap2,ap3,aplen 是乙個等差序列。輸入描述 input description 輸入的第一行包含乙個整數 t,表示組數。下接 t 組資料,每組第一行乙個整數 n,每組第二行為乙個 1 到...