update
This commit is contained in:
parent
0ddc2570ac
commit
97dcb4586e
@ -2,13 +2,33 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
using ll = int64_t;
|
using ll = int64_t;
|
||||||
using std::cin, std::cout;
|
using std::cin, std::cout;
|
||||||
|
|
||||||
const ll maxn = 5e5+5;
|
const ll maxn = 5e5+5;
|
||||||
ll n, k, a[maxn];
|
ll n, k, a[maxn], ans[maxn];
|
||||||
std::vector<std::pair<ll, ll>> adj[maxn];
|
std::vector<std::pair<ll, ll>> adj[maxn];
|
||||||
|
std::map<ll,ll> dp[maxn];//dp[i][j]:第i个节点距离颜色j的最大值
|
||||||
|
|
||||||
|
void dfs(const ll &fth, const ll &u)noexcept{
|
||||||
|
dp[u].emplace(a[u],0);
|
||||||
|
// dp[u][a[u]]=0;
|
||||||
|
for(const auto& [v,w]:adj[u]){
|
||||||
|
if(v==fth)continue;
|
||||||
|
dfs(u,v);
|
||||||
|
for(const auto& [kk,vv]:dp[v]){
|
||||||
|
if((dp[u][kk]>0||a[u]==kk)&&(dp[v][kk]>0||a[v]==kk)){
|
||||||
|
//更新与u,v子树有关的红温值
|
||||||
|
ans[kk]=std::max(ans[kk], dp[u][kk] + dp[v][kk] + w);
|
||||||
|
}
|
||||||
|
dp[u][kk]=std::max(dp[u][kk],dp[v][kk]+w);
|
||||||
|
if(a[u]==kk)ans[kk]=std::max(ans[kk],dp[u][kk]);//更新当前节点的红温值
|
||||||
|
}
|
||||||
|
dp[v].clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
std::iostream::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
|
std::iostream::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
|
||||||
@ -21,6 +41,6 @@ int main(){
|
|||||||
adj[u].emplace_back(v,w);
|
adj[u].emplace_back(v,w);
|
||||||
adj[v].emplace_back(u,w);
|
adj[v].emplace_back(u,w);
|
||||||
}
|
}
|
||||||
|
dfs(0,1);
|
||||||
|
for(ll i{1};i<=k;i++)cout<<ans[i]<<'\n';
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user