From fea7c9ae58c290fbd04b671b1f307617b98bc3eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Mon, 15 Jan 2024 13:22:59 +0800 Subject: [PATCH] 'commit' --- TangDou/Topic/HuanGenDp/P3047.cpp | 105 ++++++++++++++----------- TangDou/Topic/HuanGenDp/P3047.eddx | Bin 0 -> 12036 bytes TangDou/Topic/【换根】dfs专题.md | 77 ++++++++++++++++-- 3 files changed, 130 insertions(+), 52 deletions(-) create mode 100644 TangDou/Topic/HuanGenDp/P3047.eddx diff --git a/TangDou/Topic/HuanGenDp/P3047.cpp b/TangDou/Topic/HuanGenDp/P3047.cpp index c5a1281..450112a 100644 --- a/TangDou/Topic/HuanGenDp/P3047.cpp +++ b/TangDou/Topic/HuanGenDp/P3047.cpp @@ -1,60 +1,77 @@ #include +#define endl '\n' +#define INF 0x3f3f3f3f using namespace std; -#define int long long -#define endl "\n" +typedef long long ll; +typedef pair pii; +const int N = 1e5 + 10; +vector edge[N]; +int f[N][25], g[N][25]; +int val[N]; +int n, k; -const int N = 200010, M = N << 1, K = 21; +void dp(int u, int father) { + for (int i = 0; i <= k; i++) + f[u][i] = val[u]; + for (int i = 0; i < edge[u].size(); i++) { + int son = edge[u][i]; + if (son == father) + continue; + dp(son, u); -// 链式前向星 -int e[M], h[N], idx, w[M], ne[M]; -void add(int a, int b, int c = 0) { - e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++; -} - -int n, q; -int dp[N][K]; - -void dfs1(int u, int fa) { - for (int i = h[u]; ~i; i = ne[i]) { - int v = e[i]; - if (v == fa) continue; - dfs1(v, u); - for (int j = 1; j <= q; j++) dp[u][j] += dp[v][j - 1]; // 第一遍dp + for (int j = 1; j <= k; j++) { + f[u][j] += f[son][j - 1]; + } } + return; } -void dfs2(int u, int fa) { - for (int i = h[u]; ~i; i = ne[i]) { - int v = e[i]; - if (v == fa) continue; - // 在第一次遍历时 dp[1][2] 包括了 dp[2][1] 2的子树权值; - // 然鹅 ans在统计dp[2][3] 的时候也加上了 dp[2][1] 2的子树权值; - // 第二次遍历 dp[2][3] 又加上了 dp[2][1]; - // 所以需要简单容斥一下; - for (int j = q; j >= 2; j--) - dp[v][j] -= dp[v][j - 2]; // 简单容斥 - for (int j = 1; j <= q; j++) - dp[v][j] += dp[u][j - 1]; // 第二遍dp - dfs2(v, u); +void dp2(int u, int father) { + for (int i = 0; i < edge[u].size(); i++) { + int son = edge[u][i]; + if (son == father) + continue; + g[son][0] = val[son]; + g[son][1] = f[son][1] + val[u]; + for (int j = 2; j <= k; j++) { + g[son][j] = g[u][j - 1] + f[son][j] - f[son][j - 2]; + } + + dp2(son, u); } } -signed main() { - // 初始化链式前向星 - memset(h, -1, sizeof h); - cin >> n >> q; - for (int i = 1; i < n; i++) { +void solve() { + cin >> n >> k; + for (int i = 0; i < n - 1; i++) { int a, b; cin >> a >> b; - add(a, b), add(b, a); + edge[a].push_back(b); + edge[b].push_back(a); } - for (int i = 1; i <= n; i++) cin >> dp[i][0]; // 每个节点往外0距离,就是它本身的权值; - dfs1(1, 0); - dfs2(1, 0); + for (int i = 1; i <= n; i++) + cin >> val[i]; + + dp(1, 0); + for (int i = 0; i <= k; i++) { + g[1][i] = f[1][i]; + } + dp2(1, 0); + // for(int i = 1; i <= n; i ++ ) + // { + // cout << f[i][k] << endl; + // } + // cout << endl; for (int i = 1; i <= n; i++) { - int ans = 0; - for (int j = 0; j <= q; j++) ans += dp[i][j]; // ans统计答案 - cout << ans << endl; + cout << g[i][k] << endl; } -} \ No newline at end of file +} + +int main() { + ios::sync_with_stdio(0); + cin.tie(0); + cout.tie(0); + + solve(); +} diff --git a/TangDou/Topic/HuanGenDp/P3047.eddx b/TangDou/Topic/HuanGenDp/P3047.eddx new file mode 100644 index 0000000000000000000000000000000000000000..325dced48f0de38b1be43d792965d5ec98296e03 GIT binary patch literal 12036 zcmb_?Wo#VVvh|pm*^Zf+nVFfHnVFd#Gcz+YL(I$^GsO@?%xu5po_n9pdD4}>AK#36 zcXf5|Rjc-vdPcQMK^g=U6#xK00^qdiH5^v)s)vC908&r@0QR@n#NOD|*3{00&coIw zG-+OLg8?<{iu?kXXb0k)B{?9mfUclg2`d7&{b4_8snVEu)R3TgbZt1-^!tH~cg%2L z%aC=mj>!14-)HNG^OroHrGYMpEeBE*kq3qw0rV(GP117K68wTBcl({8465(g#n+v2 zO{q)?HUeG)-JcH~yM7F2R(#G*F+0JZw zE*n-V5=raypnVzD3t4l%cS+6xky-2n9ye=hhlL-$#43WMH3!8tgHxx^rao6R`IPi# zTh7pYxVZKN>$L#iakK&j>>`hlK0scv&fVLMht`_aC`!MSYc**rt$wQ0s5Z#u3BO>_ zQ&q5-D3mT7{!ok_ZkV4=VIj^`1`3_;&L>)~v}AMJcslTHi*vN=RNODbGP%{crK`{+ zrQmRRVILy#F}-RZZW{RY+Pe%hzT3|kQ^VfcikrjHbs$Gd&l1pmG*#{8gld4{2hgi| z(SVHAvnMF0OsS z0EFM$?OP-J z*%{2{wL3oC-mUkWHGBC^%B*CWd|H)_tfg9t;=Da|G4QFC>h3G_x0CwKToZv> z9gR^cn8l6G-qm!f*F9FI(pZH%{C-crkhN>x%~Vo|{@P?zJ`rl(5DUt385BlqyjZ z4)Ni{%KWdFFfV0Xg+#dUtcfev;Jeat2^`Hr2X+xUJ>?ixTcZVJqSITiC>Kwrej!d4 zwvnw|qYiQ=LnQ0~-sCdfDjC|s0GdwL(I+Zih0(Q-&Qkan4e$KTS{H=-H16=u3U1%- zMp3U8Z^;l`-yr6i_`pyqP*2qcF@#FH5w-7gVwFYhMcYh@xEa_^W8+jRaK)HIy}W+a zk>eRrvHZ^)*F9}DRaMfeZ~85bd-MwN=#%K`pV$q#n^M8ttuCnHV~Cj<<&ol zn;L6jTlz0b&Pv0=21UdVT;v7yRH@a#^3Cd+?*n6hben_TU{v399*B^Qa;!GQecT=n zzSbHKC51jz@73bf@jP8$A?VDiEjJjY3%i=o<$JqbjebbR`dbT&;$>ls@bfyH&r;@PZ3}fDGwT`)9_=`a z(m76aXo^Z+OUv2{@9e%{zRZ_jQMiatq=S3D{fO&p{~B1#dp)e_o{E|2`E$a4Yo#=u z{A;#47Ht($gX4Bq_GP!b)2E;T5|LGLQ^IgMLZ@)C_3JC-gaPADe#AACcnGSdHhzqP z7PYhDFSOK%oT_Qrx@O=@#3;7T*ip)ZNGCv!UG z$55tkq|6hz=cu{T26?KZDMu!YclnjbmvThyc)&+13k*glnpbVj&p+jaI5*mDTx>CF zy3;js!J_C1N)%$QM$#C=t2V%VyLZcnJNnW_1f*;XOz)n7xK8*y&>(I&2SHB!nXC=E9&fi#8;1gh(se_yfP z!F<8|dLpk>LRJaq4h?_BS+n4^E-t<+Q6i;tDoy3PgRfvk9l|B>G!?CWMp0UUP3-+k zad}M7Z=K;TEfW2}pyA|BU};tC{d{6bRRzhC^-G0mbJQ3xezoaRmBQ_VBA;xxQspZq zNn_#KSGB%n(Aay4jiFY7NiEg`Z3qm&bFBOKyKB58!K%xj8G)_{HG>J`Ni;Ko@4w(* zTHGd8#C<25$DEdOvD>0Mp+AmTY>5b=fTe8~(p{BFXu4`=j;3HN2qarGre%?}%2yS6 z3o~mj>RFZG`k~%!NriQzFR^= zQ>{4DrN7F;OeDLLw9aC!(8z#(xSY~@afpGQ@uRWpbjG0(6FWR`EHQpw+m6wc1$p_g zrnsc#>YSbI>idOUEGJrzMp}SN!-NWkw80KEb!W1YPeoQ(nV319wnLV=qa=xx5bw+u ziHT9LfOn4Eir>(8bAfRq!2;Nx1jT7>$-a`?OUIQAph`5$CtqNznq8vyIwnCY^6<3iPw_>*C?GL~B@^2}^a(fea^7HX8uT;Z~`H=x+z?qO1 zME@}g^S}Ic0Zk5?c>=p2vM)3*GJe(3Pf7Ua5iO5QNI57^D}m3a9*`IEWWWjjA2L8M z5GQ#O8UHpcg#P%hPx3~D=J|oe_iVbAg}T3_0RJIc<09}mMg0y^79u1ifC40ossQ*a ze0k`<4I=Qs|4@or5Lv(~jPyXaAX-J76A?h6C6fg$3*lkS_kY_4dPk80+#&qQ^Uo5< z7t8$HU?KeD^SF!aR=AUQqOc77D#Z7PP(dpENuFnk|8BB^1k|4-fua8}0A)dHLHx^5 z93uD=<&RHMF|)iwfkn}YhETA$80-&6t<%4)RblDB=?0M9pazgZPyR)^&_O6aat2R! zhzUj%g*1;087m6)PbiBLkW33bOCpbqDP@qC(JS0J{sPdy`2H&ckqOYhQV~G`es`WZ z&1>buCPa-o+X8OhiRQgE&*gT3dh)o+>)L&2{@yzN%gcg zb$W*6vuidwxB@e@gCNxq{eyj-;!9{B?=-Q&G&6*<^{KOZ*W3{$Y$DR*^pH|wbA^fySBJfI^1IO)(hK} zV}v^UIBr(L5g|OyOFcl?W-C&N1KE2bPIfj3a${W4+2rdA*Pj)fU{_B61#Z+r<$!bk zh`+mY3?ij{U6@pk0zL&4+6iePKQSGgtkh^OQ0nv}lF*q5tSe$MSju!7Elf%VFQ0^| z2_PkBd>AB|r~)8k^vvyvG6y1x1S9~6oz?-F^_KbOBgq8TK)L=n3fDrt%* z35B|pI6{0aRKy`OVaM=F%+6^dSGtSNNiBnn$v529_(LvIJkjjtTTIeTFbU;Tyd9ZL zqE41L9VLv6(L0n$fFvNv2RK0T7?rHVNpfC2pQZ{1GLhqK(z5KWo_6mvUci$}1&>5_ z*x(`Db~?U;46KEPIhaIF?z*m;vzs0?&UV8|Mzvk_m8y9(>0u zNcwDNljr1}p1qlFJqO1PAaSsX@>d$m7AbHkt_DO}mtGtH-c@jkXFZ!H!|`THk_`Gg zBOHAI@sV#`OddkI%H>=uCs;u=e~%F5;`qU3^%LE<9jb1d;VGg%^oC7U~BB(%rxji`J&+o`Y3RXe@&dn`ZYc7&dGXKd z_Iy0NRIlmelw(rFAB`kV=nMviyu?)u*xfed1bqzK-Bv!2MBLmk#|`o}x2jZrX~hwT z8)oU7LOY7A3eTi8AwpCa&{33z7+UT|R_7s>{o0|FWo7TrFVO%wBTTz)tbwiMpLer~ z2uZi9O3)s#3;h$&e`J+Q8wA4#1VN)H0;Ew`|3!nyATogT_m4{I32dXtl0>reB(h`7 z$w9AYpkyLuXk41#B>CkQKW9<31 z2j54fLC|_5sj;(D%qhHhZbB~<@yP9DWVuL5m@(azP0!aCT562QlI95gzWcuWS;d_f z_fD-JW73FZ-_)lO$p8bOPfqE<7g#>;ttMYcKTvx$h)R6kQ(;0`_bCix+P^p^XIeg4 zP(3gm6p?U@DDG-7@focr$L*xDslOex5oJLTHZ(=DQ?kGeWtn6UF?P^98r23QIb+I3 zPU6T$##RByo-45okiU`W!<(a#?Va+i({$BeCsPQVqW0=6m?*`IoCp(TUkMY*W!voZ zEPdNlk`fs?T?5HCfzinyf|386Bz+o_(o0^Vxw+O>)A~lA21=l`O`ir30ggaL1c-2z zAx6qaXgBTV(K*Itb38>n>?PW&0Kn*F;kjQ?%hR_e*rrG0>NX-cm*XtASC}8 zVIEe1C6Qtq&?#BiB(N8p8)IO^agu>}CCAYR!Mg?iH37-<+QU7r_qodL?YJ&($Mdnw zerF%g|K+;Ko{!J(V)?+G&->>6k^Jg?96Idr>770H)Aw;c&ENCxNSr*c`~4|JJx<^I zX|e6<{c{H7A)MP^#Ijjj-|zh?xK1JJK>mvN190r-bETWSKR!6?*edbsDTbRPPyR~N z^TXkoPHLv$ko>W4POjH;6s|`cx!01M$M4;_ibTzcop$KB2@U-~=0Yal?T0CO17t&3 zseTB}SG{rI64s$FsD@;53&I=d-sB=1xT?Q!B1NzU4P^H7t(!ISH9IVIH3*<)=VGyg zcbJxFNnZ!N;Tm#hAt#5m_TJSv`q1ct(P{&zgLWd~S0#d|jVRTNZEAm&Xo*goL@7+5 zbp%j%Xp7FAMCpv6z4gkXs}C{Ng2s@vFVGxGjTq9WIguXJn`bE1qGCOC??C3QN(fa+ zl<4d=br7Xkq45<_$0*gZFn0{FN_8wuoj_}kpz&?gA4|1B=Q*x9muQ8~vYm5wOlj;f z!@tVZ#vjMPCt5CZPXL8+@Pqub97OVKIM;Tho74wlt^h76lM{iLc?SjyB0+ zjk!~eDqC3!m4c;E&^WNYb2MC65}HbA$?13i$Y(%y5g-`Q5O$E;rODl3ujb^nxYVNW zb?yiaqql9h)6wide=K|u0O}N2ZiHZubt~F(@?2Y^n?q#qt;1wj5@I5Uiw95XOdatY|)tf4x2} z?lp6$_m^llOlHGI0mJUpG_o`P_T6S9QEViOnsN0`deSf^`T+U|2 zUgRtBk+0Lv(tB*anw|h{gUz&NnSkd6;}!D`;8$gOQrrwLM-v0d3MlL9ZCY#<=SJ5V zb8xy$#RpC7@Mb8^LTALCFM{4X0$!s6M;TL7dqr{qzUEM=9 zmC~HKV0N@3Kd5?-d1wd9Mq#nr3MqtmhNP@lQspil&hHW)L z{Suf{m<|TR7~2jGY`M&nS7>=_enM64>6STUjzH3q(j=S;j3 zZ&J!H*UXT*rk?r0niumCn!9H#pmkp%n(d&P@EQ}BFd#yrTKq^Y@pZ$AH|p-P{M>DBo?E=D*~6KL zI_?%!gR`s&Q<+P3dO@$MOx{^OwinO;1E_J-D>9v9yBn@Xh}XI*9{3){7OkaS^%wCi z>YG!ra{b899a6JnMJH%lET)VN(bqdP%f9n?hp{YD15`utZo?yX@TkQHr`^YTFmyfF}z=o7h`VaVi`!#EfkJPstAIUcu)O-U>m(C zp+$4VyP@xx&r2=Go{ZLZN+~^Kcn|$tZtU^mLtOP;!_c8SE@7}-X0h92Da*#8(Je>f z#EDfsw&E-o;s&H7BwrjD4TJSuG{2nIu_RAhZ?}Uf;1q2ZXD|T#GDJeRBJ<7n1*khm zeR7TwE@25odS#;1YEx=;`B#%Ubtd2C9mRii3s6z zQXr$OD_|6N>YhqK&9IvKlF&~=E(C=lWWm9dWHdDd>wK7unV^`Sp`2)Pr5xjn$^3Z7 zGuxTxfBC98>vehj{byHg%j3QFs#e}k?}NR+|Bd>M=9-xQj&LsnDJkh1LKF;HUXZ7M z*K6BIo9xFHZ}OqMLFZ3H$$BQ!lA3zgPN|7bDJMEupkT_14|BkIU)TbdDVi$l{XKT3 zRuo`FY>kW5^vIQJqOy{TDr#9~m`g@fUDbZlj=n{9)M%-#^z3T9Q?F_JM!>sHa1PSo z$m8bR6i!x{_+XlBWy8kiqLrKT%GGh}_{V!sT-{E;@JBykf#KdLF_E$S@H=K+e7XxA z?Yj^7$H4G;Hg(5g_gm0@B2J0v5xc$W(#lqiy+!xx(p!G;jK|vZiK9Ax_y+&CSKD8w z6#nN&PeWCbfeIua2Nzu(kGJ^W`1$>xsWihrw4O&wK$SlrUigm|R2^!R6&2MKKSxTM z=?=65YNO6lx2(MMMwg70*lo9xTJ%1@-Df`N!AXx2eA_)-N0Jq$CNE%pg1g`!`*1f% z`;<5N1iaeQ0oepMChi|m{v1$X$e3zv1w67@*}7$la+GpvPhhLnKEf_Pz zJv^7)Rsbak=dBPp><-=^QnBsc2}BCY(|}(LQ+Q_@O=y-ECAuG;Z8{-EJAH1^=dp#{ zwt?)D@|az5L&&4OyDX_hl!a_i=%TRE!Di-m;SQw7E+CFU*w##V9xpzre zYEhy`Fb^3!WhXBiKg@PsE4q`{;gM}=n7-Avr5fM6a`2L@$!>BnEX2R<*V@=>p8G`E z^6TkryY0n)sg)f(Cq*T;r#GOYW*@_y4g+G!J;x2D`aETDZi?2R8*!3V{xmHE;6Rr} z;|zq9Jsb?Rm`lIe7Lma9bVKp&aTTh_QHnSBf zcDM?wdpmL|m}k076JFex-I&e0EvbH=w_!b{ zTJv(>in0nz%h>(0n||TAG~AwEaA{jgA&74HSkcWrCpi^OTza0JGMh(959k>YJ+y7= z^6+o-t}DB4iSz3mY%}8fuJtKB(R3qlc6_H7WX!Iw_p)$*@BU&opfr#s!L*8nq+1C=(2>rDnyuasKx{=Z%n0Rvwpos-Z|gB zR3}U(GBFsYyZPRQ&YWnc?5=_+X&C~JKq>^L@#!Xp6o7Gos6t9UK!TrAgGS+q>$ga`^i9`x^ zLcey_#Yx$rc-U zOhRQW_3ZXV!b`;WE&7mdDMv9$1ek)uX4I*dMbqSx$)I_PZ5RJq1&4gN|CXmE@W~H3 z`^iPj^12H8B$0Rny5uREdH2v#If5xG(SA=NkIfCvGHS{CdN^!>E|+@|v-3Soh-X&9 z7oSOvnKfeIsL%Sw9j`}6PX3MPoI^&(Jez$Z_H%1$ehQl7gO6+(3jpC~;pcZSh;Z?t zZoQ#PpQ^LYUW~h^??rK9)ni%Lbm%@?lRrH=gqyIp84yh&s@uhAH9Y~$+#W=Qr45^B zqZY?#KMl;e`PDs*z7a;_C-F*(tD&drF~9E*qUI|cJ7Dsl(PH>(mI2A$W9i9<=*-YVP`+y&N@Y4Ff)-IDw2V@7j zx%q6E)RREepVCecyVmD<i+=!@-eD7q-RvzX`F9xI0llsHrZ2LhgvkpsJLTh|Y47l|+W`$A$KKdv`(cD|Oy- z7+(*hE0Ayg@Z4IAYrGCmpvy=Zw{*Q;dD!xY&K-{$7`6q`01~}H9$4Ccen;!Tt>Q+e zkqK-ZL9dV|I^Zftmq#OXDv2c$>5Z%=eGejUv8(4}toGU(D{OlB7(~s3;$y#8NJ1xD zdwfZgh7qmH{LDlgcHTuz1<^OVVxkVx2p>XBq8;V|`ZN3*Q z0nh&Qtk<=zv-mP2KzlWPShdG3Lg3g*wI?BG^z=HiGZfkC27$RDZWpa;_JO{lU|h3@ zv&4X*nQ|x1crmsWBK;a-A1J8!`5Zr_zs& z*iv$=?>8?+>F^cE^-Pq*gFEEshN<27`Yp75NI@I}$Q2y{+eow`v70eUp({v>Il7qp zcEmK{rP25tF7K65B85!i4SB zFAZn+doO^O?MvzXLCU%`M=|Z|M9+x~LMpz!hjO+$0T5hS@V+?S*PS z{_D}HjUSv@!W9O1_QjUfRnlwwapBGGIn%dg!*T5eyDh_S7Nd@F+vS;K(aIZ^?vR5O zy{GCdWPWX9EZ)s`a?@trp0#k5$r2#7}$5kQTz%^hgA#wT+xJAfYD%V9;A>AP~iKvnp zXvKD3Nv|2HT+CXxU1O`asq_-=gFG}x#g~>*ldMad9L+l`gT-ZpHCLjW!Wecp#WeG@ z>SN9pmZBgM_||MGk=M28x?Fp+=4PDw1*g}N6`zzP*D^!@5b<#VGe^nbLin zhP}^Rg)N07UDids%-*g+%=D!{EO>;P(6+g?o^R&9I%g-bX5x19Y26KrM>0YMX5C21 zp2OAu_$f|;)$HIQZ8dfvwP$3r6eM_#)U-bVn&7+h-nR^q`Qnk)QpD~#2tuuM&?vOe zqDySA2TRydf+py8{k3PG=TTu!EaF65PN|3hVIElWlULF-@`=3yMy1=SMnPnYfnLMM zEh_+SNiKcG6bSbF8L%44_??|oIes594z=3RB6}OB`K6AFm>i8DTMh{2s@ar@7e@w2 z^AeRSW*Ru#?&;GQX@($+=-tT3*Sy|{b7L$fv=mNoNk^>>PK=j*`0^DImq&{mHQoLx z6yIE-b;XV+{H9kZ>?$vjz|apEO9zm!C$jtX9)xP&XvfE`njS#sV?Pe$mUa+~eys&D zPH%_OtQ8UI>LWB|F`WJ7b=$90dw+jgs;lb1++7uEv-WVDHj!au<8htEeg;EQFzTXY6@4o}ciG6_-8_%>VX zzCFxvh3?KC)l;hQdo$1f02N8_X;VAG!-p`r)zBuC0r_Ye3p++)!$TAal6(vfdu||)H?m4_XlHXqS#7I$L*GZ1vc26W^t8Q_EKAX&+})a$RGw!#KROfZ z%OrXf@QmYHWk}J%a+i2XmobjQVPbFosrnUjC9OX$?WYw<;vgR#kmx@A$$1c@s9Wn* zD!`Avs6X`C7t9eu@FPad4W=y>d9ioC_U?o^jmJ*Cba)I%OD+veuBva3;O4bZR6cHB$Sg%} zdDlP&#oIX0XZopiTi?}N%E^K3vCv#lz&xyvP!oU40j?v9??B{o@AFv0lGN=eBRwNX z-bh2HVAXgqjm`kB5z-+OVhutSV@6UyWswF6c$r|*#jJX)5jq6kI8Y0 zO~e;7zjl2FpbUVLY0{ugSI< za?!2F{gX_y?B^)^Psj(v7%vOLXPYPeviSV%+gaP`UYZMvj;!;aG78PbF0Xe@`J59v zixmxdVv}7|%1n&*{LAKRSK{@25Ejgj-F$&;%%E@8PlIx(@48=lZW<%nn|3+}Vg)Dl zg=57I`>FC#Gr$E6K>`4%CX3%-K9g{Z#&Y`zc6(3fh{2mJ-S{u@gpQ0ucXM=abUy07 z)qmUv(`rBJXea(6sP+g8(x3-TZMs|y!bDeHGRB9Sxm#C;tM`!YZND&wC>t&=kf6BB zPH$y5B=2u&az6U*I=@7^d5|P<%t~Si1HT(N^@_tu!p!q?He+X1-`M#fM;%fW}t`*dZxf8XiiBd>5qg^m-5}afi71{PJLg0vQA7 z4G^CmHL$nwpYE2CC?%M*ko&c#54hCYtGfiPxcT;NTZU2SJR2B3`=`eQ6x)}Ei;GcJ zWXLOH#5)uGnOTvuaU2FCY8UU@WN~3VFlT1O?rbw5Uv4>-9YsIa+$%q2hB)?JoqKjti1n6x`vJFBZ({65s5B4$Tshn{=% zMMD5gN)e3v6W|y*Igdx&^bL6xi1tmw1(d(e=lu5uYgH96 z0EAUZvFZPX_-C8$-yyDk_iF#2rrrOF@^{?@{$Fy)e~5himSO&>_5449p!@^G **解释**:每个节点,向下走$0$步,也就是一步不走,那还是它自己的点权,也就是$f[i][0]=a[i]$ -第二次$dfs$我们通过已经求出的$f$数组推$g$数组,对于$u$和$u$的儿子$v$, +**递推式** +$$f[u][j] = \sum_{v \in son[u]}f[v][j - 1]$$ + +第二次$dfs$我们通过已经求出的$f$数组推$g$数组,对于$u$和$v$, $$g[v][k] += (g[u][k - 1] - f[v][k - 2])$$ -注意数组下表不要越界。$g[i][j]$的初始值应该赋为$f[i][j]$,因为根节点的$g[i][j]$就是$f[i][j]$。(第二次$dfs$已知父亲节点推儿子节点) +---- + +题目简单地来说就是: +给你一棵 $n$ 个点的树,点带权,对于每个节点求出距离它不超过 $k$ 的所有节点权值和 $m_i$。 + +对于树中的某个节点而言,距离它不超过$k$的节点主要来源于两方面: +- 一个是该节点的子节点中距离该节点不超过距离$k$的节点的权值和 +- 一个是该节点向上沿着父节点方向不超过距离$k$的点的权值和 + +对于子节点方向的节点的权值和,我们可以先通过普通的树形$DP$计算出来。 + +因此,我们先写一个$DP$计算出子树中距离该点不超过$k$的点的权值和。 + +**1、状态表示** +$f[u][k]$表示以$u$为根节点的树中,距离$u$不超过$k$的子节点的权值和。 + +**2、状态转移** +$$f[u][j]=val[u]+\sum_{v \in son[u]}f[v][j−1] \ j \in [1,k]$$ + +到节点$u$不超过距离$k$,即距离$son$不超过$k−1$,然后加在一起即可。同时$u$节点本身也是答案,因为$u$节点本身是不超过距离$0$的节点。 + +**3、换根$DP$** +这个题目本身是个无根树,如果我们认为规定编号为$1$的节点是根的话,那么对于祖宗节点$1$来说,$f[1][k]$就是距离$1$节点不超过距离$k$的节点的权值和。因为祖宗节点是没有父亲节点的,所以我们就不需要考虑沿着父节点方向的节点权值和。 + +令:$g[u][k]$表示所有到$u$节点的不超过距离$k$的节点的权值和。根据刚刚的分析:$g[1][k]=f[1][k]$ + +这个就是我们换根$DP$的 **初始化**。其实受这个的启发,我们完全可以去把每个点都当作根,然后暴力跑出答案,但是这个暴力做法的时间复杂度是$O(n^2)$的,会超时。 + +所以当我们将祖宗节点从节点$1$换为另一个节点的时候,我们只能通过数学上的关系来计算出$g$数组元素的值。这个也是换根$DP$的意义。 + +我们看下面的图: + +![](https://dsideal.obs.cn-north-1.myhuaweicloud.com/HuangHai/BlogImages/202401151316634.png) + +红色框是非常好理解的,直接写成$f[u][k]$即可。上面的部分,我们可以写成$g[fa(u)][k-1]$。 +因为到$u$不超过$k$的距离,即距离它的父亲节点不超过$k−1$的距离。 + +但是这么写对吗? + +答案是不对的,$g[fa(u)][k-1]$和$f[u][k]$是有重复部分的。我们需要减去这段重复的部分,那么关键问题是重复部分如何表示? + +重复部分肯定是出现在了红色框中,红色框中到$fa(u)$不超过距离$k−1$,即距离$u$不超过$k-2$,同时重复部分又恰好是节点$u$的子节点,所以这部分可以表示为:$f[u][k-2]$。 + +所以最终的结果就是: + +$$\large g[u][k]=f[u][k]+g[fa(u)][k−1]−f[u][k−2]$$ + +但是上述方程成立的条件是$k\geq 2$的。 + +所以我们还得想一想$\leq 1$的时候。 + +如果$k=0$,$g[u][0]$其实就是$val[u]$,因为不超过距离$0$的点只有本身。 +如果$k=1$,那么$g[u][1]$其实就是$f[u][1]+val[fa(u)]$,因为沿着父节点方向距离$u$不超过$1$的点,只有父节点,而树中,父节点是唯一的。沿着子节点方向,其实就是$u$的各个子节点,而这些子节点可以统统用$f[u][1]f[u][1]$表示。 #### [$P6419$ $Kamp$](https://www.luogu.com.cn/problem/P6419) https://www.cnblogs.com/Troverld/p/14601347.html