模擬96 題解

2022-03-16 19:19:07 字數 1597 閱讀 7326

顯然可以將式子中的行列貢獻分開考慮。

於是問題轉化為等差數列求和。

然而模數比較大,為了避免高精度可以用慢速乘。

顯然問題具有單調性,於是可以二分答案,然而這個演算法並沒有什麼用。

考慮使用基於倍增的二分。

然後用個歸併排序,因為$\sum \limits_^i*2^i$與$k*2^k$是同級別的,

所以可以保證每次倍增大小至與最終的區間大小複雜度呈乙個$log$的關係。

所以總的複雜度是$o(nlogn)$。

這題是李煜東原題

設$f_i$表示從$i$到$n$這一段路徑中用過封路許可權,最優決策下的路徑長度。

因為封路許可權只有一次,設$d_$表示封掉$(i,j)$這條邊之後,$i$走到$n$的最短路。

那麼有$f_i=\min\limits_(max(d_,f_j+w_))$。

表面上,裡面的取$max$,表示b

哥有一次作出限制的機會,外面的取$min$則表示小$a$的最優決策。

實際上這個式子似乎並沒有想象的那麼簡單。

b哥只有一次作出限制的機會,也就是說

當$d_>f_j+w_$,b

哥只能取一次$max$,表示割掉這條邊。

但對於乙個$i$,取了多次$max$,這顯然是存在錯誤的。

正確的做法應該是取出所有的$f_j+w_$,b

哥的最優決策應當是限制其中最小的乙個,也就是只對最小的乙個取$max$。

之後小$a$會再取其中最小的乙個,視作取$min$。

然而對於存在環的轉移,這種實現方法似乎並不現實。

實際上題解中給出的式子是可行的,因為$f_i>=dis(i,n)$

所以$d_>f_j+w_$僅當$(i,j)$是$i \rightarrow n$最短路徑上的邊,

如果求出最短路樹,$i \rightarrow n$之間存在唯一路徑,

也就是說$d_>f_j+w_$僅有一次,所以題解中簡單的取$max$操作是正確的。

所以這個$f$陣列可以用最短路求出,問題在於如何求$d$陣列。

仍然考慮上面提到的最短路樹,設$dis_i$表示從$n$到$i$的最短路的路徑,即樹上的唯一路徑。

顯然割掉非樹邊,$i$仍然會沿著樹邊走到$n$,問題是簡單的。

對於割掉樹邊,設連線的兩個點為$(u,v)$,會形成兩個聯通塊。

設$u$在$n$所在聯通塊中,$a$在$n$所在聯通塊中,$b$在$v$所在聯通塊中,$a,b$相連。

顯然$b$在$v$的子樹中。

最優路徑為$n \rightarrow a \rightarrow b \rightarrow v$

即$d_=dis_a+w_+dis_b-dis_v$

發現這個式子與$(a,b)$相關的項太多了,只要列舉這條邊$(a,b)$,可以更新一條鏈的答案。

用樹上差分的思想,可以用乙個$multiset$維護出現了哪些值,可以做到查詢最大值。

當然這裡要用啟發式合併,來保證複雜度是正確的。

當然也可以用一些樹鏈剖分之類的操作進行區間取$max$操作。

實際上這個還可以用類似並查集的結構實現。

發現乙個邊只要被最小的元素更新就可以了。

所以可以用類似並查集的結構維護每個點已經更新到哪個父親,之後可以暴力跳父親,更新$d$值。

省選模擬96 題解

a.多邊形 因為本題保證了 n 不為偶數,所以 n 沒有 frac 這個迴圈節。然後考慮 frac 這個迴圈節,如果能形成銳角一定有 m 3 如果存在更小的迴圈節,那麼一定不存在銳角了。所以盡量特殊處理一下 m 3 這個情況,然後對於 ans 0 用全集 補集去求。對於其他的情況,可以考慮求出迴圈同...

省選模擬96

容易發現當 k 3 時無解。然後容易證明當 k 3 時,只有 m 3 才是有解的。然後直接做不好做,考慮欽定然後容斥出合法方案。對於 k 3 列舉乙個點,然後計算另乙個的方案數。其他情況類似,欽定滿足條件的角,然後容斥。然後對於每乙個 o n 的式子用組合恒等式大力化簡就可以做到 o 1 了。考慮每...

模擬17 題解

t1 a.入陣曲 60 演算法 維護一下某一列的從第一行到這一行和二維字首和 然後列舉上下左右邊界,o n 4 100 演算法 省掉左右邊界的列舉,改為從左向右掃一邊,記錄總和 k的餘數,並放入桶中,可以發現,如果這個值出現過,那說明這個位置的總和減去那個位置的差 即這個區間 是k的正倍數 t2又是...