我是div2選手!!!
碰上了自己不擅長的數位DP,各種囧啊,前三題水的一逼,我還wa了一次,然後妥妥的掉分了
A題:
如果有零的話,去掉從左往右數的第一個0即可
B題:
這類題目以後要多多加強啊,這道題先預先處理出cnt[i],表示有i個lucky dig的數有多少個,這個過程用到了數位類DP的基本方法
處理出來後可以用一個dfs暴力求得答案
戳這裡看代碼
C題: 讓你構造一個序列,序列的最小公倍數就是這個序列中最大的數,而且每個數分別小於另一個序列,求可以構造多少個這樣的序列。 顯然,這個序列中除最大的那個外所有的數都是它的約數,所以可以枚舉這個最小公倍數,然後處理出所有的約數。然後問題就變成 : 將所有的約數放到n個位置(約數要小於等於所放位置的ai),可以重複 ,有幾种放法,注意,最大的那個也就是所枚舉的最小公倍數是一定要有一個位置放的。然後就這樣了
戳這裡看代碼
D題:
給你一個初始序列,然後有m個操作,每個操作會以0.5的機率交換兩個數,最後問你操作完成後這個序列逆序數的期望
試想如果知道了第i個數大於第j個數的機率,那麼只需要將所有的dp[i][j](i < j) 相加就是期望了。
設dp[i][j]表示第i個數大於第j個數的機率,初始化的時候序列是固定的,所以要麼為1,要麼為0. 對於每一個操作a b,會改變所有的dp[i][a] dp[a][i] dp[i][b] dp[b][i] (i!=a&&i!=b) 也就是跟a b 有關的狀態,所以需要枚舉每一個i,如果不交換a b兩個位置的數,簡單,原來dp[a][i]的機率乘個0.5就好了, 如果交換 ,當前a位置的數就變成當前b位置的數了,那麼dp[a][i] = dp[a][i]
* 0.5 + dp[b][i] * 0.5(當前a位置的數從b位置拿過來的) ,就這樣,我還在位置與數值之間傻逼了半天了呢!
戳這裡戳這裡
E題:
比較常見的樹形結構轉換成線性結構用線段樹來做.
推薦兩個題
這題 和 那題
這個題的話需要記錄每個點和誰一起進行過操作,每次每個點單獨處理,將跟這個點一起操作的所有的鄰接點所代表的區間都放進線段樹,統計總點數的時候就相當於 的區間合并吧。
戳這裡看代碼