CodeForces 600E Lomsat gelral (樹上啟發式合併模板)
題目連結:點選這裡
題目大意:
給定一棵以
1
1
1 為根的樹,每個節點都有一個顏色編號。求以每個節點為根的子樹中,顏色出現次數最多的編號之和。(次數最多的可能有多個顏色)
題目分析:
樹啟模板,更新的時候,記錄顏色出現的次數,次數超過或者等於最大值時進行更新即可
具體細節見程式碼:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
int read()
{
int res = 0,flag = 1;
char ch = getchar();
while(ch<'0' || ch>'9')
{
if(ch == '-') flag = -1;
ch = getchar();
}
while(ch>='0' && ch<='9')
{
res = (res<<3)+(res<<1)+(ch^48);//res*10+ch-'0';
ch = getchar();
}
return res*flag;
}
const int maxn = 1e5+5;
const int mod = 1e9+7;
const double pi = acos(-1);
const double eps = 1e-8;
vector<int>v[maxn];
int col[maxn],siz[maxn],son[maxn];
ll ans[maxn],cnt[maxn],sum,maxx;
void update(int u,int fa,int val,int heavy)
{
cnt[col[u]] += val;
if(cnt[col[u]] > maxx)
{
sum = col[u];
maxx = cnt[col[u]];
}
else if(cnt[col[u]] == maxx)
sum += col[u];
for(auto it:v[u])
{
if(it == fa || it == heavy) continue;
update(it,u,val,heavy);
}
}
void dfs1(int u,int fa)
{
siz[u] = 1;
for(auto it:v[u])
{
if(it == fa) continue;
dfs1(it,u);
siz[u] += siz[it];
if(siz[it] > siz[son[u]]) son[u] = it;
}
}
void dfs2(int u,int fa,int keep)
{
for(auto it:v[u])
{
if(it == fa || it==son[u]) continue;
dfs2(it,u,0);
}
if(son[u]) dfs2(son[u],u,1);
update(u,fa,1,son[u]);
ans[u] = sum;
if(!keep)
{
update(u,fa,-1,-1);
sum = maxx = 0;
}
}
int main()
{
int n = read();
for(int i = 1;i <= n;++i)
col[i] = read();
for(int i = 1;i < n;i++)
{
int u = read(),v = read();
::v[u].push_back(v);
::v[v].push_back(u);
}
dfs1(1,0);
dfs2(1,0,1);
for(int i = 1;i <= n;i++)
printf("%lld%c",ans[i],i==n?'\n':' ');
return 0;
}
相關文章
- 樹上啟發式合併
- 樹上啟發式合併總結
- 樹上啟發式合併(dsu on tree)學習筆記【理解+模板+例題】筆記
- dsu on tree (樹上啟發式合併) 詳解
- [Coderforces600E] Lomsat gelral
- 樹上啟發式合併-附有例題CF600E
- 啟發式合併
- 【題解】Solution Set - NOIP2024集訓Day12 樹上啟發式合併
- HDU7458-啟發式合併最佳化DP
- Codeforces 455C Civilization:樹的直徑 + 並查集【合併樹後直徑最小】並查集
- P4556 [Vani有約會] 雨天的尾巴 /【模板】線段樹合併
- BZOJ 3673 可持久化並查集 by zky 可持續化線段樹+並查集啟發式合併持久化並查集
- 線段樹合併 筆記筆記
- USACO 2020 OPEN Favorite Colors【並查集-啟發式合併-思考】並查集
- Java 在Word中建立郵件合併模板併合並文字和圖片Java
- 6.20-合併二叉樹二叉樹
- 資料結構--線段樹合併資料結構
- 1455G Forbidden Value(資料結構優化dp+啟發式合併)ORB資料結構優化
- codeforces 9D How many trees? (組合二叉樹)二叉樹
- 【Codeforces1404B】Tree tag | 樹上追擊、博弈、樹的直徑
- 主席樹模板
- LeetCode.617. 合併二叉樹LeetCode二叉樹
- LeetCode617. 合併二叉樹LeetCode二叉樹
- Hbase-原理-region合併和hfile的合併(大合併、小合併)
- [分散式][高併發]高併發架構分散式架構
- leetcode 617.合併二叉樹 JavaLeetCode二叉樹Java
- 線段樹模板
- 【模板】珂朵莉樹
- 歸併排序模板排序
- CSS的樣式合併與模組化CSS
- 深入剖析Vue原始碼 - 選項合併(上)Vue原始碼
- leetcode 每日一題 617 合併二叉樹LeetCode每日一題二叉樹
- 【Leetcode千題】617. 合併二叉樹LeetCode二叉樹
- PHP 圖片的合併,微信小程式碼合併,文字合併PHP微信小程式
- 動態主席樹模板
- 【模板】最小生成樹
- pandas中如何使用合併append函式?APP函式
- [Codeforces 1111E] Tree(虛樹+二項式反演)