顯然可以將式子中的行列貢獻分開考慮。
於是問題轉化為等差數列求和。
然而模數比較大,為了避免高精度可以用慢速乘。
顯然問題具有單調性,於是可以二分答案,然而這個演算法並沒有什麼用。
考慮使用基於倍增的二分。
然後用個歸併排序,因為$\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又是...