zay大爺的膜你題 D2T2 不老夢(AK夢)

2022-04-12 06:36:30 字數 2734 閱讀 7375

還是萬年不變的外鏈

這個題。。。。。是最難的。。。。但是不知道為啥扶蘇神仙講完了之後我竟然聽懂了。。。。

所以這個題我要好好寫一寫

首先我們看一看每乙個測試點,來一點點得分

第乙個測試點n = 1,直接輸出w1就行,5分到手

第2-5個點,資料範圍很小,我們可以打深搜

因為n = 8,所以即使是全排列也無非是8!,小的可憐,然後o(n)地check一遍是不是合法,所以最後的時間複雜度是o(n!n)

要考慮排列順序一定是保證某個點的所有兒子都出現之後才能出現,否則不合法,而對於合法的排列,我們計算其w值,並且min(ans,w的和),最後輸出ans即可,然後就又拿到了20分

第6-7個點,我們可以發現那玩意是個二叉樹,這個就好辦多了,

我們考慮這樣乙個東西

現在我們掃到了乙個根節點為a的點,他有兩個兒子分別是x,y,如果先進入x,那麼我們需要的石子數就是w[x](指的是其子樹的和)+w[a],同理,先進去y的話,我們需要的石子數就是w[y](指的是其子樹的和)+w[a],假設w[y]更大的話,我們先進入y,當我們把y的子樹放滿了,我們就可以放y這個點了,在把y放上之後,我們可以把y的所有子樹的石子拿出來扔到x的子樹裡去,這樣不僅能不多用石子,甚至還有可能多餘出石子放在a裡,要是你先進x的話,就會導致你還得多帶上w[y] - w[x]個石子,否則你將放不滿y的子樹,這樣就不合法了

因為是二叉樹,所以直接判斷就好啦,最後所有答案加起來就是結果啦

測試點8-10,因為最多只有5個孩子,又因為n不算太大,我們可以暴力算出選孩子的順序看那個最優秀,時間複雜度是o(5! n),說實話5! = 120的話,最後也不過是1e6多一點,正常跑就行了

測試點 11-14: 樹高最多為 3。考慮進入第 3 層時由於不能**石子,所以進入第三層的順序無所謂,即對於第 2 層的每個節點 u,都有

。現在只需要考慮從 1 號節點 進入它的所有孩子節點的順序即可。 考慮走完節點 u 的所有孩子 v 所需要的總石子數 c[u],顯然是越少越好。證明如 下: 走完所有孩子後,所花費的總石子數不變,設剩下的石子(也就是所需要的減去所 花費的)為 ret,注意到當 c[u] 最小的時候即是 ret 最小的時候。考慮當 ret ≥ wu 的時候,直接用 ret 放下 u 上的石子,於是放石子在節點 u 的總花費就是 c[u],後者 越小越好。 當 ret < w[u] 的時候,用剩下的石子放在 u 上,然後再額外放上去一些石子,這 樣做的花費是

,這顯然是最小的花費,考慮當 c[u] 越小 ret 才越小,c[u]取 最小時顯然能取到最優情況。 綜上,可以盡可能使 c[u]減小,來達到最優解。 那麼問題變成了: 有 x 個商品,購買第 i 個物品需要手裡有 ansi 元錢,花費 wi 元。求乙個順序 使得購買所有商品所需要的錢數最少。 這個問題的最最優順序是按照

不公升序購買,也就是差值越大越要先買。 考慮證明: 設有兩個物品 i,j,設 ai=ansi-wi,aj=ansj-wj。且 ai>aj。考慮先買 i 再買 j 的 花費是 max(ansi, wi+ansj) ①,同理先買 j 的花費是 max(ansj, wj+ansi) ②。 提出 w,則 ①=wi+max(ai,ansj),②=wj+max(aj,ansi)=wj+max(aj,ai+wi)=wj+ai+wi。 考慮 ① 式的 max 如果取前面一項,則 ①=wi+ai

最後貼一下**吧

#include #include 

#include

const

int maxn = 100010

;int

n;int

mu[maxn], ans[maxn];

std::vector

son[maxn];

void dfs(const

intu);

bool cmp(const

int &_a, const

int &_b);

intmain()

for (int i = 1; i <= n; ++i)

dfs(1);

for (int i = 1; i < n; ++i)

printf(

"%d\n

", ans[n]);

return0;

}void dfs(const

intu)

std::sort(son[u].begin(), son[u].end(), cmp);

int _ret = 0;

for(auto v : son[u])

else

} ans[u] += std::max(0, mu[u] -_ret);

}inline

bool cmp(const

int &_a, const

int &_b)

還有。。。。。。。c++11是個好東西可惜我不會。。。。。。。。

大爺的字串題 莫隊

題目描述見鏈結 題意 求區間內出現最多的數字出現的次數 使用莫隊,記 ton g x tong x tong x 表示 x xx 出現了幾次,再記 num x num x num x 表示出現 x xx 次的數字有多少個,m ax num max num max nu m 表示答案,放上很久以前寫的...

noip膜你賽day2第一題

題意 有乙個由0和1組成的陣列,定義一種新運算azui,1 azui 1 1,1 azui 0 0,0 azui 1 0,0 azui 0 1,給出乙個長度為n的該陣列,以及m個查詢l,r,表示將區間 l,r 從l乙個乙個azui到r的值。題解 額,先說說稍微複雜一點的做法,可以發現,這個azui運...

noip膜你賽day2第二題 小G的煩惱

題意 有n座城市,m條雙向的航線連線它們,每一條航線有兩個值,分別是p,q,假設你付出x,y的花費那麼對於所有滿足p x q y的航線,都可以免費乘坐 其實題目本身來說是有乙個小彎的,就是說如果你付出的x,y並不能讓你乘坐那條航線,你也可以額外付這一條航線錢,但顯然,這是不優的 求最小花費 有自環和...