More Related Content
More from HCPC: 北海道大学競技プログラミングサークル (20)
立命合宿2016Day3:F問題
- 2. 問題概要です。
l きっちりした数列を、以下で定義する。
- 長さN(偶数)で、1 ≦ i ≦ N/2 について Si = SN-i+1 である。
l Q個のクエリ(l,r,x)が来る。
- Sl, …, Srにxを加算する。
l クエリごとに、以下の問に応える。
- 数列がきっちりしているか。
l 主な制約は、以下の通りである。
- 2 ≦ N ≦ 500000かつ1 ≦ Q ≦ 100000である。
- 3. サンプルである。
0 1 2 3 4 4 3 2 1 00 1 2 3 4 4 3 2 1 0
0 1 2 3 4 4 3 2 1 0
+0
きっちり
である。
+5
0 6 7 8 4 4 3 2 1 0
きっちり
でない。
+10
0 6 7 8 4 4 13 12 11 0
+5
0 11 12 13 4 4 13 12 11 0
きっちり
でない。
きっちり
である。
- 4. 想定解法である。
l きっちりの見方を変える。
- 1 ≦ i ≦ N/2 について Si = SN-i+1である。
→1 ≦ i ≦ N/2 について Si – SN-i+1 = 0 (差分が0)である。
l 範囲更新可能な区間木、または平方分割で差分を管理する。
- セグ木なら O(logN)で、平方分割なら O(√N)でできる。
l Si – SN-i+1 がすべて0であるかどうかを、高速に応答する。
- mini=1,...,N/2{Si – SN-i+1}とmaxi=1,...,N/2{Si – SN-i+1}が、共に0ならばよい。
- つまり、Range Minimum (Maximum) Query になる。
l 区間木なら O(logN)で、平方分割なら O(√N)でできる。
l 全体の計算量は、以下のとおりである。
- 区間木ならO(Q logN)で、平方分割ならO(Q√N)である。
- 5. 想定解法の概略図である。
2 4 5 4 2 2 3 4 4 2
0 0 1 1 0
クエリ (l,r,x) = (5,8,1)
0 0 1 1 0
折り返して差分を取
る。
+1
-1
折り返しに気をつけて、
区間更新を高速に行う。
-1
0 0 1 1 -2 max = 1, min = -2 → いいえ。
0 0 0 0 0 max = 0, min = 0 → はい。
Range Minimum (Maximum) Query に高速に応えられればよ
数列がきっちりしている
か。
←このように考えると楽かもしれな
い。