1. 程式人生 > 其它 >2022寒假刷題計劃

2022寒假刷題計劃

1.28

P4310 絕世好題
二進位制小清新dp,\(O(n\log n)\)

CF618F Double Knapsack
神仙構造,大膽猜想,小心求證。
猜想一定存在兩段連續的序列滿足答案。
字首和有 \(n+1\) 項,嘗試構造值域為 \(n\) 以利用鴿巢定理。
\(suma[i1]-suma[j1]=sumb[i2]-sumb[j2]\) 可以轉換為
\(sumb[i2]-suma[i1]=sumb[j2]-suma[j1]\)
找到第一個大於等於 \(suma[i]\)\(sumb[j]\),此時因為 \(b[j]\in[1,n]\),故 \(sumb[j]-suma[i]\in[0,n)\)

,值域為 \(n\) ,利用鴿巢定理就可以找到解。

P2371 [國家集訓隊]墨墨的等式
同餘最短路入門題。
同餘最短路用來求 \(n\) 個數 \(a_1,a_2\cdots\) 在一定範圍內能湊出多少數。
我們任意找一個 \(a_x\) 記為 \(x\)
把所有自然數按對 \(x\) 取模分為 \(x\) 類。
我們只要找到每一類中第一個能被湊出的數 \(p\),那麼該類中後面的數都可以通過 \(p+k\times x\) 湊出來。
考慮如何找到每類中第一個能被湊出的數,建一張有 \(x\) 個點的圖,每個點代表每一類數,那麼每個點 \(i\) 連一條有向邊 \((i,(i+a[j])\bmod x)\)

,邊權為 \(a[j]\)\(j\)\(1\)\(n\),代表從一類數變成另一類數需要加上 \(a[j]\)(此處複雜度 \(O(n x)\))。然後只要從 \(0\) 跑一遍最短路,此時的最短路就代表每類中第一個能被湊出的數了。
然後我們選擇 \(x\) 時如果選擇最小的 \(x\) 就可以讓點數最小,從而降低時間複雜度。
一篇優質博