E. Lomsat gelral
1.P3478 [POI2008] STA-Station2.E1. Weights Division (easy version)3.P5007 DDOSvoid 的疑惑4.P2168 [NOI2015] 荷马史诗5.P8306 【模板】字典树6.P1481 魔族密码7.P3128 [USACO15DEC] Max Flow P8.P3258 [JLOI2014] 松鼠的新家9.P5536 【XR-3】核心城市10.P5836 [USACO19DEC] Milk Visits S11.P3384 【模板】重链剖分/树链剖分12.P3038 [USACO11DEC] Grass Planting G13.P4551 最长异或路径14.F. Alex's whims15.J. 上学16.Game on Tree17.E. We Need More Bosses18.A. Party19.D. Strong Vertices20.B. Omkar and Heavenly Tree21.B. Mahmoud and Ehab and the bipartiteness22.P8655 [蓝桥杯 2017 国 B] 发现环23.P10298 [CCC 2024 S4] Painting Roads24.F. Gardening Friends25.D. Playoff Tournament
26.E. Lomsat gelral
27.F. Minimum Maximum Distance28.D. Book of Evil29.P2195 HXY造公园30.P3304 [SDOI2013] 直径31.D. Sasha and a Walk in the City32.D. Vitaly and Cycle33.P10838 『FLA - I』庭中有奇树34.F - Perfect Matching on a Tree题解
暴力:遍历所有点为根节点的情况,然后遍历子节点,统计众数,时间复杂度
优化:上面的算法时间复杂度之所以为
运用重链剖分,每次保留重儿子所在的子树的贡献,遍历轻儿子所在子树所有点的贡献,时间复杂度来到了
证明:
令轻儿子的“上边”为轻边,则每有一个轻边,都要遍历一遍其子树内的所有元素
所以节点
因为轻边所在子树大小小于父节点所在子树大小的一半,所以根节点到任意节点的路径上,轻边数量不超过
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll dfn[100005];
ll sizes[100005];
vector<ll> G[100005];
ll bigson[100005];//代表编号
ll cnt=0;
ll haxi[1000005];
void dfs1(ll now,ll fa)
{
dfn[now]=++cnt;
haxi[cnt]=now;
sizes[now]=1;
ll maxs=0;
for(auto next:G[now])
{
if(next==fa) continue;
dfs1(next,now);
sizes[now]+=sizes[next];
if(sizes[next]>maxs)
{
bigson[now]=next;
maxs=sizes[next];
}
}
}
ll tot=0;//出现不同颜色数
ll line=0;//最大出现次数
ll ans=0;//贡献
ll sum[100005]={0};//维护每个颜色出现的次数
ll st[100005]={0};//维护出现过的颜色的编号,算是离散化
void cancel()
{
while(tot) sum[st[tot--]]=0;
line=0;
ans=0;
}
ll c[100005];
ll res[1000005];
void add(ll id)
{
if(!sum[c[id]]) st[++tot]=c[id];
sum[c[id]]++;
if(sum[c[id]]>line)
{
ans=c[id];
line=sum[c[id]];
}
else if(sum[c[id]]==line) ans+=c[id];//由于颜色出现统计只有清零和增加两种,所以ans要么变大要么为零
}
void dfs2(ll now)
{
for(auto next:G[now])
{
if(dfn[next]<dfn[now]||next==bigson[now]) continue;
dfs2(next);
cancel();//取消其贡献。为什么要取消?为了清空计算其他子树
}
if(bigson[now])
{
dfs2(bigson[now]);
}
for(auto next:G[now])
{
if(dfn[next]<dfn[now]||next==bigson[now]) continue;
for(ll i=dfn[next];i<=dfn[next]+sizes[next]-1;i++)
{
add(haxi[i]);//加上其贡献
}
}
add(now);
res[now]=ans;
}
void solve()
{
ll n;
cin>>n;
for(ll i=1;i<=n;i++) cin>>c[i];
for(ll i=1;i<n;i++)
{
ll x,y;
cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
dfs1(1,1);
dfs2(1);
for(ll i=1;i<=n;i++) cout<<res[i]<<' ';
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
ll t=1;
//cin>>t;
while(t--) solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~