設答案為$f_u$。
對於葉子結點,$f_u=w_u$。
對於非葉子結點,考慮它的所有兒子$v$,設有$m$個,則只要最小化$\max\limits^m_((\sum\limits^_w_)+f_)$,$f_u$即為最小化的答案。
那麼如何最小化這個東西呢?把所有兒子按$f_v-w_v$降序排序即可。
證明:考慮兩個兒子的情況,我們只需證明按上述方法排序後有$\max(f_1,w_1+f_2)\le \max(f_2,w_2+f_1)$。
若$\max(f_1,w_1+f_2)=f_1,\max(f_2,w_2+f_1)=w_2+f_1$顯然成立;
若$\max(f_1,w_1+f_2)=f_1,\max(f_2,w_2+f_1)=f_2$,則$f_2>f_1$,成立;
若$\max(f_1,w_1+f_2)=w_1+f_2,\max(f_2,w_2+f_1)=f_2$,則$f_2若$\max(f_1,w_1+f_2)=w_1+f_2,\max(f_2,w_2+f_1)=w_2+f_1$,則由$f_1-w_1\ge f_2-w_2$知$w_1+f_2\le w_2+f_1$,成立。
用數學歸納法可知結論對於更多兒子也成立。
#include#includeview code#include
using
namespace
std;
const
int n=100050
;char rb[1
<<21],*rs,*rt,wb[(1
<<21)+50
];int wp=-1
;inline
char gc()
inline
void flush()
inline
intrd()
short buf[15
];inline
void wt(int
x) wb[++wp]=x|48
;
while(l>=0)wb[++wp]=buf[l--]|48
; wb[++wp]='';
}int
a[n],g[n],to[n],nxt[n],f[n];
vector
p[n];
inline
bool cmp(int x,int y)
void dfs(int
u) sort(p[u].begin(),p[u].end(),cmp);
for(i=0;iif(res>=f[p[u][i]])res-=a[p[u][i]];
else
f[u]+=max(0,a[u]-res);
}int
main()
for(i=1;i<=n;++i)a[i]=rd();
dfs(1);
for(i=1;i<=n;++i)wt(f[i]);
flush();
return0;
}
洛谷P1036 深搜
原題目 給定n個數字裡面選擇k個數字進行操作,使用遞迴操作。也類似於深搜。include using namespace std int ans 0,n,k,a 25 bool prime int x return true void rec int start,int count,int sum ...
洛谷P1312 Mayan遊戲(深搜)
mayan puzzle是最近流行起來的乙個遊戲。遊戲介面是乙個 7 行5 列的棋盤,上面堆放著一些方塊,方塊不能懸空堆放,即方塊必須放在最下面一行,或者放在其他方塊之上。遊戲通關是指在規定的步數內消除所有的方塊,消除方塊的規則如下 1 每步移動可以且僅可以沿橫向 即向左或向右 拖動某一方塊一格 當...
洛谷P1101 單詞方陣 深搜
題目描述 給一n n的字母方陣,內可能蘊含多個 yizhong 單詞。單詞在方陣中是沿著同一方向連續擺放的。擺放可沿著 8 個方向的任一方向,同一單詞擺放時不再改變方向,單詞與單詞之間可以交叉,因此有可能共用字母。輸出時,將不是單詞的字母用 代替,以突出顯示單詞。例如 輸入 輸出 8 qyizhon...