日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

中心城镇问题(长链剖分优化树形dp)

發(fā)布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中心城镇问题(长链剖分优化树形dp) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

problem

給定 nnn 個城市,n?1n-1n?1 條道路,形成一棵樹。每座城市上的人口為 wiw_iwi?

現(xiàn)要修建若干個中心城鎮(zhèn),滿足任意兩個中心城鎮(zhèn)之間的距離嚴(yán)格大于 kkk

最大化中心城鎮(zhèn)的總?cè)丝凇?/p>

n,k≤106,wi≤109n,k\le 10^6,w_i\le 10^9n,k106,wi?109

solution

這種限制樹上關(guān)鍵點彼此之間距離是比較經(jīng)典的題目了,通常都會考慮 uuu 子樹內(nèi)離 uuu 最近的關(guān)鍵點的距離為多少,設(shè)計狀態(tài)轉(zhuǎn)移方程。

有非常套路的樹背包,設(shè) fu,i:uf_{u,i}:ufu,i?:u 子樹內(nèi)離 uuu 最近的關(guān)鍵點深度為 iii(此深度是以 111 為根意義下,在整棵大樹中的深度)的最多人口數(shù)。

fu,0=wuf_{u,0}=w_ufu,0?=wu?。考慮逐個加入 uuu 的子樹 vvv

  • (i?dep[u])<<1>k(i-dep[u])<<1>k(i?dep[u])<<1>k

    gu,i←fu,i+fv,ig_{u,i}\leftarrow f_{u,i}+f_{v,i}gu,i?fu,i?+fv,i?

  • (i?dep[u])<<1≤k(i-dep[u])<<1\le k(i?dep[u])<<1k

    gu,i=max?{gu,i+1,fu,i+fv,k+2dep[u]?i+1,fu,l+2dep[u]?i+1+fv,i}g_{u,i}=\max\Big\{g_{u,i+1},f_{u,i}+f_{v,k+2dep[u]-i+1},f_{u,l+2dep[u]-i+1}+f_{v,i}\Big\}gu,i?=max{gu,i+1?,fu,i?+fv,k+2dep[u]?i+1?,fu,l+2dep[u]?i+1?+fv,i?}

  • gu,dep[u]=max?{gu,dep[u]+1,fu,0+fv,depu+k+1}g_{u,dep[u]}=\max\Big\{g_{u,dep[u]+1},f_{u,0}+f_{v,dep_u+k+1}\Big\}gu,dep[u]?=max{gu,dep[u]+1?,fu,0?+fv,depu?+k+1?}

最后更新回去 f←gf\leftarrow gfg

所求即為 f1,0f_{1,0}f1,0?

事實上,有用的只有 i∈[dep[u],dep[u]+k]i\in\big[dep[u],dep[u]+k\big]i[dep[u],dep[u]+k],這是 O(nk)O(nk)O(nk) 的。

事實上,有用的只有 i∈[dep[u],dep[u]+lenu]i\in\big[dep[u],dep[u]+len_u\big]i[dep[u],dep[u]+lenu?],其中 lenu:ulen_u:ulenu?:u 子樹的高度(鏈長度),長鏈剖分優(yōu)化,時間復(fù)雜度就只有 O(n)O(n)O(n)

fu,i:uf_{u,i}:ufu,i?:u 子樹內(nèi)離 uuu 最近的關(guān)鍵點,二者的相對距離為 iii 的最多人口數(shù)。

excuse me???

動態(tài)數(shù)組我真的會謝,卷爺 vector\text{vector}vector 都能跑過去,這是什么人啊!

code(vector—MLE)

#include <bits/stdc++.h> using namespace std; #define maxn 1000005 #define int long long vector < int > G[maxn], f[maxn]; int n, k, ans; int w[maxn], g[maxn], len[maxn], son[maxn];void dfs1( int u, int fa ) {for( int v : G[u] ) {if( v == fa ) continue;else dfs1( v, u );if( len[son[u]] < len[v] ) son[u] = v;}len[u] = len[son[u]] + 1; }void dfs2( int u, int fa ) {f[u].resize( len[u] + 1 );f[u][0] = w[u];if( son[u] ) {dfs2( son[u], u );for( int i = 1;i < len[u];i ++ ) f[u][i] = f[son[u]][i - 1];if( k < len[u] ) f[u][0] += f[son[u]][k - 1];f[u][0] = max( f[u][0], f[son[u]][0] );}ans = max( ans, f[u][0] );for( int v : G[u] ) {if( v == fa or v == son[u] ) continue;else dfs2( v, u );for( int i = 0;i <= len[v];i ++ ) g[i] = f[u][i];for( int i = 0;i <= k and i <= len[v];i ++ ) {if( i > ( k >> 1 ) ) {if( i ) g[i] += f[v][i - 1];}else {if( 0 <= k - i - 1 and k - i - 1 < len[v] )g[i] = max( g[i], f[u][i] + f[v][k - i - 1] );if( 0 <= i - 1 and k - i < len[u] )g[i] = max( g[i], f[u][k - i] + f[v][i - 1] );}if( i ) g[i] = max( g[i], f[v][i - 1] );}for( int i = len[v];~ i;i -- ) {f[u][i] = g[i];if( i + 1 < len[u] ) f[u][i] = max( f[u][i], f[u][i + 1] );ans = max( ans, f[u][i] );}} }signed main() {scanf( "%lld %lld", &n, &k ); k ++;for( int i = 1;i <= n;i ++ ) scanf( "%lld", &w[i] );for( int i = 1, u, v;i < n;i ++ ) {scanf( "%lld %lld", &u, &v );G[u].push_back( v );G[v].push_back( u );}dfs1( 1, 0 );dfs2( 1, 0 );printf( "%lld\n", ans );return 0; }

code(動態(tài)數(shù)組—AC)

#include <bits/stdc++.h> using namespace std; #define maxn 1000005 #define int long long vector < int > G[maxn]; int *f[maxn], *ip; int pos[maxn << 2]; int n, k, ans; int w[maxn], g[maxn], len[maxn], son[maxn];void dfs1( int u, int fa ) {for( int v : G[u] ) {if( v == fa ) continue;else dfs1( v, u );if( len[son[u]] < len[v] ) son[u] = v;}len[u] = len[son[u]] + 1; }void dfs2( int u, int fa ) {// f[u].resize( len[u] + 1 );f[u][0] = w[u];if( son[u] ) {f[son[u]] = f[u] + 1;dfs2( son[u], u );// for( int i = 1;i < len[u];i ++ ) f[u][i] = f[son[u]][i - 1];if( k < len[u] ) f[u][0] += f[son[u]][k - 1];f[u][0] = max( f[u][0], f[son[u]][0] );}ans = max( ans, f[u][0] );for( int v : G[u] ) {if( v == fa or v == son[u] ) continue;else f[v] = ip, ip += len[v], dfs2( v, u );for( int i = 0;i <= len[v];i ++ ) g[i] = f[u][i];for( int i = 0;i <= k and i <= len[v];i ++ ) {if( i > ( k >> 1 ) ) {if( i ) g[i] += f[v][i - 1];}else {if( 0 <= k - i - 1 and k - i - 1 < len[v] )g[i] = max( g[i], f[u][i] + f[v][k - i - 1] );if( 0 <= i - 1 and k - i < len[u] )g[i] = max( g[i], f[u][k - i] + f[v][i - 1] );}if( i ) g[i] = max( g[i], f[v][i - 1] );}for( int i = len[v];~ i;i -- ) {f[u][i] = g[i];if( i + 1 < len[u] ) f[u][i] = max( f[u][i], f[u][i + 1] );ans = max( ans, f[u][i] );}} }signed main() {scanf( "%lld %lld", &n, &k ); k ++;for( int i = 1;i <= n;i ++ ) scanf( "%lld", &w[i] );for( int i = 1, u, v;i < n;i ++ ) {scanf( "%lld %lld", &u, &v );G[u].push_back( v );G[v].push_back( u );}dfs1( 1, 0 );ip = pos;f[1] = ip;ip += len[1];dfs2( 1, 0 );printf( "%lld\n", ans );return 0; }

總結(jié)

以上是生活随笔為你收集整理的中心城镇问题(长链剖分优化树形dp)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩激情在线视频 | 四虎网址在线 | 日韩欧美日本 | 蜜桃久久久 | 夜夜躁狠狠躁日日躁av | 国产又粗又黄又爽又硬的视频 | 91影院在线观看 | 性高潮久久久久久 | 亚洲综合在线观看视频 | 黄色大片视频网站 | 国产97色在线 | 国产 | 男女h网站 | 在线国产日韩 | 超碰在线网站 | 久久久久久爱 | 日韩狠狠 | 成年免费视频黄网站在线观看 | 欧美日韩xxxx | 亚洲欧美国产高清va在线播放 | 久久久成人免费视频 | 天天综合网入口 | 大肉大捧一进一出好爽mba | 中文字幕 欧美日韩 | 手机看片午夜 | 丰满双乳秘书被老板狂揉捏 | 麻豆视频免费网站 | 性一交一乱一伧国产女士spa | wwwxxx在线| 99在线免费观看 | 草莓巧克力香氛动漫的观看方法 | 欧美日韩性 | 黄色一毛片 | 操丝袜美女视频 | 91尤物国产福利在线观看 | 一级免费看片 | 伊人网狼人 | 无码精品一区二区免费 | 欧美午夜精品理论片 | 浪漫樱花动漫在线观看免费 | 国产一极毛片 | 先锋av在线资源 | 一区二区免费播放 | 精品一级少妇久久久久久久 | 久久99精品久久久久 | 少妇无码av无码专区在线观看 | 欧美裸体网站 | 91手机在线 | 欧美一区二区三区久久 | 国产又色又爽无遮挡免费动态图 | 欧美成人手机在线 | 中文字幕在线视频免费 | 亚洲第一中文字幕 | 欧av在线| 国产精品综合久久久久久 | 黑人玩弄人妻一区二区三区四 | 久久久av网站 | 美女脱了裤子让男人桶 | 久草手机在线视频 | 无码h黄肉3d动漫在线观看 | 老司机深夜视频 | 超碰98在线观看 | 麻豆导航| 亚洲精品天天 | 久久久久久影院 | 奇米影视四色777 | 伊人色综合网 | 亚洲人免费视频 | 有色影院 | 日韩一区二区在线视频 | 欧美 亚洲 激情 一区 | 手机在线观看毛片 | 久久精品成人 | 中文字幕在线观看一区二区三区 | 日韩视频在线免费播放 | 91精品福利在线 | 狠狠干狠狠操视频 | 超级碰在线视频 | 放几个免费的毛片出来看 | 把高贵美妇调教成玩物 | 国产黄a | av2018| 久久99久久久久久 | 久久久久人妻精品色欧美 | 国产精品久久久久久久久夜色 | 极品尤物一区二区 | 琪琪色在线视频 | 99爱这里只有精品 | 日本aaa视频 | 高清乱码免费 | 国产一区二区免费 | www日本xxx | 四虎成人在线 | 中文字幕一区二区精品 | 91福利一区| 尤物国产 | 4438全国最大成人网 | 女同性做爰三级 | www.国产91 | 香蕉成人av |