原題大賽
可以發現,兩個人相遇後都會掉頭走,這意味著每個人位置的相對順序是不變的。
那麼運用乙個套路,讓相遇的兩個人穿插而過,那麼現在要求排名為任意值的人的位置。
二分套二分即可
結合 link 和 link 可以學到許多與分組有關的 dp 知識。
首先要確定關鍵字排序,當然是按 s
is_i
si 排序了,那麼同一組的人的極差就是第乙個人和最後加進的人。那麼正常的 dp 狀態是 fi,
j,kf_
fi,j,k
表示前 i
ii 個人分成 j
jj 組極差和為 k
kk 的方案數,但是不能知道哪個組有沒有結束,所以 j
jj 那一維應該是有 j
jj 組沒有結束。那麼轉移為
f_ +\!= f_ & 作為最小值新開一組 \\ f_ +\!= f_ \times j & 隨便插入一組 \\ f_ +\!= f_ \times j & 作為最大值結束一組 \\ f_ += f_ & 作為最小值和最大值新開一組並結束 \end
⎩⎪⎪⎪⎨⎪
⎪⎪⎧
fi+1
,j+1
,k−s
i+
=fi,
j,k
fi+1
,j,k
+=f
i,j,
k×j
fi+1
,j−1
,k+s
i+
=fi,
j,k
×jfi
+1,j
,k+
=fi+
1,j,
k作
為最小值
新開一組
隨便插入
一組作為
最大值結
束一組作
為最小值
和最大值
新開一組
並結束
第四個容易落掉。用滾動陣列優化掉第一維,然後這樣 dp 還需要乙個偏移量防止陣列下標出現負數,複雜度為 o(n
2×∑i
si)o(n^2 \times \sum_i s_i)
o(n2×∑
isi
),會超時。
優化的應該是 k
kk 這一維,因為我們求的是極差和 <
k<
k ,但這個 k
kk 有很多想去不掉的冗餘狀態。那麼神仙來了,他用了差分的思想,令 si=
ai−a
i−1s_=a_-a_
si=ai
−ai
−1ai−
aj=a
i+1−
ai+a
i+1−
ai+2
+ai+
2−ai
+1+⋯
+aj=
aj−1
⇕ai−
aj=∑
k=i+
1jsk
a_-a_=a_ - a_i + a_ - a_ + a_ - a_ + \cdots + a_j = a_\\ \updownarrow \\ a_-a_=\sum_^ s_
ai−aj
=ai
+1−
ai+
ai+1
−ai
+2+
ai+2
−ai
+1+
⋯+aj
=aj
−1⇕
ai−
aj=
k=i+
1∑j
sk
可以發現這個式子在不斷增長的,所以只需要轉移 k
kk 以內的即可。
01 trie 的板子,有異或、和、或三個情況,會寫在這 link。
20ZR提高組十聯測 Day3
沒啥意義吧。就是乙個圖一定可以分成兩個點集,之間的邊個數一定可以超過總邊數一半,正確性顯然。wyz 神仙吊打 std。舉乙個 k 2 k 2k 2 的栗子。000 111001 10000101 10100 如果將連續的 k kk 個相同數稱為合法串,那麼合法串是可以任意移動的。而且你可以同時移動初...
20ZR普及五連測 Day1
請問有多少個長度為 n nn 的排列 p pp 滿足 i pi 1 i p i leq1 i pi 1,答案對 998244353 998244353 998244 353 取模。設 f if i fi 為確定了前 i ii 位的排列個數,那麼第 i ii 個位置要不然填 i ii,要不然填 i 1...
20ZR普轉提七連測 Day1
進行 dmo d360 d bmod 360 dmod36 0 討論一下,發現有四個 兩個 乙個一迴圈。然後預處理前四次操作的答案即可,注意對絕對值的處理。如果能確定吃哪些餐館,當然就是不回頭依次吃。那麼列舉那個餐館一定吃,在它之前的餐館可能吃也可能不吃,二分一下吃耗時最小的多少個餐館,套個區間前 ...