日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91av亚洲| 色屁屁 | 色噜噜狠狠狠综合曰曰曰88av | 欧美成人免费观看视频 | 日韩欧美精品一区 | 国产一级视频 | 日韩福利一区二区三区 | 97超碰国产精品无码蜜芽 | 天天撸天天操 | 国产伦精品一区二区三区免费迷 | 成人毛片一区二区三区 | 成人片在线免费看 | 95视频在线| av爱爱| 日本精品一区视频 | 亚洲国产精品无码观看久久 | 天天干天天爱天天射 | 9·1·黄·色·视·频 | 国产欧美一区二区精品忘忧草 | 日日夜夜狠狠爱 | 91久久综合精品国产丝袜蜜芽 | 日韩av三级在线观看 | 成年人黄网站 | 欧美tickle狂笑裸体vk | 高h全肉污文play带道具 | 一本色道久久综合亚洲精品图片 | 在线你懂| 性欧美精品| 秋霞国产精品 | 麻豆视频91 | 精品人体无码一区二区三区 | 久久视频精品在线 | 九色在线播放 | 成人一卡二卡 | 日韩精品欧美精品 | 久久99国产综合精品免费 | 五月开心网 | 日韩精品tv | 干干干日日日 | 亚洲美女自拍 | 人人爱爱 | 黄色成人在线播放 | 精品国产区| 啪视频在线 | 污视频网站在线看 | 久久在线免费视频 | 亚洲天堂成人网 | 免费国产| 视频在线观看电影完整版高清免费 | 国产美女精品在线 | 久久三级精品 | 日本va欧美va国产激情 | 99久久99久久精品国产片果冻 | 中文在线观看免费高清 | 97超级碰碰人妻中文字幕 | 美女光屁股视频 | 欧洲最强rapper网站直播 | 黄色自拍网站 | 日本少妇xxxxx | 国产成人精品午夜福利Av免费 | 日本成人激情 | 亚洲六月丁香色婷婷综合久久 | 欧美综合在线视频 | 97干在线视频 | 男女免费网站 | 久久久无码精品亚洲无少妇 | 大胸奶汁乳流奶水出来h | 国产主播av在线 | 亚洲视频入口 | 日韩人妻精品一区二区三区视频 | 777777av| 136福利视频导航 | 成人三级电影网站 | 男女做爰真人视频直播 | 日本一区二区三区视频在线观看 | 青青草国产精品视频 | 国产无码精品在线观看 | 日本资源在线 | 91成人短视频在线观看 | 国产精品视频免费观看 | 嫩草影院中文字幕 | 亚洲午夜精品一区 | 国产精品二区视频 | 亚洲永久在线观看 | 国产精品高潮呻吟久久av野狼 | 亚洲精品男女 | 亚洲精品在线看 | 骑骑上司妻电影 | 午夜视频一区二区 | 天天躁夜夜躁狠狠是什么心态 | 久久久久亚洲av无码专区喷水 | 青春草视频在线免费观看 | 国产日批视频 | 一级片免费的 | 在线观看亚洲视频 | 精品一区二区电影 | 国产乱码精品一区二区三区亚洲人 | 可以直接观看的av | 免费三级网 |