算是一道比較新穎的題目 儘管好像是兩年前的省選模擬賽題目。。
對於20%的分數 可以進行爆搜,對於另外20%的資料 因為k很小所以考慮上狀壓dp.
觀察最後答案是乙個連通塊 從而可以發現這個連通塊必然存在乙個深度最淺的點且唯一 所以隨便找乙個點做根然後對自己子樹內尋找答案就可以是正確的。
考慮另外的30%的資料k<=3 可是顏色數最多可以有n個 不知道哪個是最終答案。
一次狀壓dp的複雜度:\(2^\cdot n\)
容易得到可以暴力列舉一下 然後要做 \(c(n,3)\) 這樣會tle。
此時可以考慮一種隨機化:每次隨機三個顏色是誰 這樣一直跑...
顯然這個和上面那個差不多 也是乙個低效率的隨機 這裡要用到乙個非常好用的思路 曾經在[gxoi/gzoi2019]旅行者 這道題中有類似的體現。
後者是 發現每次跑最短路可以跑多源對多源的且一些不優的點對對答案無影響 才可以進一步的使用不斷的分組來得到答案。
而這個 可以考慮另外一種比較高效的隨機 不需要每次都求出到底是哪幾個點是答案 而我們只需要讓其在答案中得到體現。
做法是 由於只有k個位置 給每個顏色rand乙個位置然後直接求 這樣做可以發現如果不是最優解 那麼顯然答案會更小 對答案沒影響。
觀察一下這樣隨機的效率\(\frac\) 每做一次是0.03的概率 那麼做多次概率就》1了 在期望的角度是很容易得到正確答案的。
這裡我加了卡時 強制跑0.8s再退出 這樣正確性會更高.
code
//#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define inf 1000000000000000000ll
#define rep(p,n,i) for(int i=p;i<=n;++i)
#define fep(n,p,i) for(int i=n;i>=p;--i)
#define vep(p,n,i) for(int i=p;i'9')
while(ch>='0'&&ch<='9')
return x*f;
}const int maxn=10010,n=5;
int n,k,len,ans,maxx;
int a[maxn],b[maxn],c[maxn],fa[maxn];
int f[maxn][1<
NOI P模擬賽 奶油蛋糕塔(狀壓 DP)
資料範圍1 n 5 1 051 leq n leq5 times10 5 1 n 5 105 n 20 n leq 20 n 20 的狀壓應該都會吧,狀態記錄已經選了的蛋糕集合,以及蛋糕序列的尾部奶油,然後列舉蛋糕轉移。總共有 10 1010 種不同的蛋糕,資料很小。把最後的蛋糕塔等效為乙個序列,如...
P3694 邦邦的大合唱站隊 狀壓dp好題!!
題目 其實看這道題實際上就是列舉m個樂隊的排列,然後對應的站在該樂隊多佔的位置,卻不是該樂隊的人需要出隊。然後最後一定可站成同一團隊連續的排列。那麼下面的dp方程就很好理解啦。注意 從狀態s 在s後面放乙個樂隊j 一定需要增加的出隊的人數為 樂隊j所佔的容量num j 處不是樂隊j的人的個數。dp ...
模擬賽4 數字序列 50分做法 狀壓DP
題意 求由1到k之間的數字組成的,滿足如果ai aj,則i j ai的序列個數 一臉懵逼在比賽中想不出ac方法,50分做法 考慮狀壓,因為新的一位能放哪些數字只和最後m 1位有關,又因為k 7,於是考慮狀壓.在50分資料也就是k 5時剛好能跑出來 時間複雜度o n k k 大資料直接 畢竟太弱 in...