1. 程式人生 > >Noip 模擬 18 2018/11/6

Noip 模擬 18 2018/11/6

T1:merchant 有 n 個物品,第 i 個物品有兩個屬性 ki,biki,bi,表示它在時刻 x 的價值為 kix+biki*x + bi. 當前處於時刻 0,你可以選擇不超過 m 個物品,使得存在某個整數時刻 t, t >= 0,你選擇的所有物品的總價值大於等於 S. 給出 S,求 t 的最小值。 第一眼二分,但是一看,發現好像不單調 其實還是單調的 假設如果是單峰的情況(也就只有這種情況不單調),那麼可以發現,t=0t=0 的時候一定是最優的,否則單調 那麼就是需要特判一下t=0 t=0 的情況 判斷時,需要選取前 m 大的,直接 sort 會 TLE(蒟蒻自帶大常數),可以用 STL 中的 nth_element,期望O

(n) O(n) 的情況下給出前 m 大的

T2:排列計數 (permutation) 求有多少個 1 到 n 的排列滿足恰有 k 對在排列中相鄰的數滿足前小於後,答案對 2012 取模。 發現O(nk) O(nk) 可以過 二維 dpf[i][j]f[i][j] 表示選到第i i 個數,有j j 對的方案數 如果第i i 個產生了一個新的對,那麼有(ij) (i-j) 個位置可以放 如果第i i 個沒有產生了一個新的對,那麼有(j+1) (j+1) 個位置可以放 所以f[i][j]=f[i1][j](j+1)+f[i1][j

1](ij) f[i][j]=f[i-1][j]*(j+1)+f[i-1][j-1]*(i-j)

T3:最短路(shortest) 給出一個 n 個點 m 條邊的無向圖,n 個點的編號從 1~n,定義源點為 1。定義最短路樹如下:從源點 1 經過邊集 T 到任意一點 i 有且僅有一條路徑,且這條路徑是整個圖 1 到 i 的最短路徑,邊集 T 構成最短路樹。 給出最短路樹,求對於除了源點 1 外的每個點 i,求最短路,要求不經過給出的最短路樹上的 1 到 i 的路徑的最後一條邊。 可以發現,一條非樹邊只會對這條邊的兩個端點到他們的 lca 產生影響 設d

is[i] dis[i] 表示i i 的最短路徑即樹上路徑 ans[i]=min(dis[j]+dis[k]+cost(j,k)dis[i])ans[i]=min(dis[j]+dis[k]+cost(j,k)-dis[i])(j,k)(j,k) 為一條非樹邊且k kj ji i 的子節點 那麼就將非樹邊按dis[j]+dis[k]+cost(j,k) dis[j]+dis[k]+cost(j,k) 排序,對於修改過的節點,用並查集壓縮路徑,保證每個節點只會被最小的值更新一次