当前位置: 首页 > news >正文

树上启发式合并 待补

对于每个子树,直接遍历所有轻儿子,继承重儿子
会了板子后,修改维护的东西和莫队是一样的

洛谷 U41492

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
constexpr int N=1e5+5;
std::vector<int> e[N];
int c[N],sum[N],ans[N],dfn[N],dfncnt,sz[N],node[N],son[N],tol;void add(int x){if (sum[c[x]]==0){tol++;}sum[c[x]]++;
}
void del(int x){sum[c[x]]--;if (sum[c[x]]==0){tol--;}
}
void dfs1(int u,int fa){dfn[u]=++dfncnt;node[dfncnt]=u;sz[u]=1;int maxson=0;for (auto v:e[u]){if (v==fa) continue;dfs1(v,u);sz[u]+=sz[v];if (maxson<sz[v]){son[u]=v;maxson=sz[v];}}
}
void dfs2(int u,int fa,bool keep){for (auto v:e[u]){if (v==fa||v==son[u]) continue;dfs2(v,u,0);}if (son[u]){dfs2(son[u],u,1);}for (auto v:e[u]){if (v==fa||v==son[u]) continue;for (int i=dfn[v];i<=dfn[v]+sz[v]-1;i++){add(node[i]);}}add(u);ans[u]=tol;if (!keep){for (int i=dfn[u];i<=dfn[u]+sz[u]-1;i++){del(node[i]);}}
}
void yrzr(){int n;std::cin>>n;for (int i=1;i<n;i++){int x,y;std::cin>>x>>y;e[x].push_back(y);e[y].push_back(x);}for (int i=1;i<=n;i++){std::cin>>c[i];}dfs1(1,0);dfs2(1,0,1);int m;std::cin>>m;while (m--){int x;std::cin>>x;std::cout<<ans[x]<<"\n";}
}
int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int T=1;// std::cin>>T;while (T--){yrzr();}return 0;
}

CF600E
板子,改一下修改操作就行了

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
constexpr int N=1e5+5;
std::vector<int> e[N];
int c[N],dfn[N],dfncnt,son[N],sz[N],sum[N],node[N],maxn;
ll tol[N],ans[N];
void add(int x){x=c[x];tol[sum[x]]-=x;sum[x]++;tol[sum[x]]+=x;maxn=std::max(maxn,sum[x]);
}
void del(int x){x=c[x];tol[sum[x]]-=x;sum[x]--;tol[sum[x]]+=x;if (maxn==sum[x]+1&&tol[sum[x]+1]==0){maxn--;}
}
void dfs1(int u,int fa){dfn[u]=++dfncnt;node[dfncnt]=u;sz[u]=1;int maxson=0;for (auto v:e[u]){if (v==fa) continue;dfs1(v,u);sz[u]+=sz[v];if (maxson<sz[v]){son[u]=v;maxson=sz[v];}}
}
void dfs2(int u,int fa,bool keep){for (auto v:e[u]){if (v==fa||v==son[u]) continue;dfs2(v,u,0);}if (son[u]){dfs2(son[u],u,1);}for (auto v:e[u]){if (v==fa||v==son[u]) continue;for (int i=dfn[v];i<=dfn[v]+sz[v]-1;i++){add(node[i]);}}add(u);ans[u]=tol[maxn];if (!keep){for (int i=dfn[u];i<=dfn[u]+sz[u]-1;i++){del(node[i]);}}
}
void yrzr(){int n;std::cin>>n;for (int i=1;i<=n;i++){std::cin>>c[i];}for (int i=1;i<n;i++){int x,y;std::cin>>x>>y;e[x].push_back(y);e[y].push_back(x);}dfs1(1,0);dfs2(1,0,1);for (int i=1;i<=n;i++){std::cout<<ans[i]<<" ";}
}
int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int T=1;// std::cin>>T;while (T--){yrzr();}return 0;
}
http://www.lryc.cn/news/183114.html

相关文章:

  • minio分布式文件存储
  • Linux新的IO模型io_uring
  • FFmpeg 命令:从入门到精通 | FFmpeg 基本介绍
  • 数组篇 第一题:删除排序数组中的重复项
  • 堆的初步认识
  • CycleGAN模型之Pytorch实战
  • C++(STL容器适配器)
  • 软考 系统架构设计师系列知识点之软件架构风格(7)
  • 【Vue3】自定义指令
  • UG\NX CAM二次开发 加工模块获取 UF _ask_application_module
  • 借助GPU算力编译Android
  • docker-compose一键部署mysql
  • MATLAB 函数签名器
  • 2019强网杯随便注bugktu sql注入
  • Html+Css+Js计算时间差,返回相差的天/时/分/秒(从未来的一个日期时间到当前日期时间的差)。
  • mybatis项目启动报错:reader entry: ���� = v
  • 【GIT版本控制】--什么是版本控制
  • ChatGPT付费创作系统V2.3.4独立版 +WEB端+ H5端 + 小程序最新前端
  • GEE16: 区域日均降水量计算
  • 打开MySQL数据库
  • 玩转ChatGPT:DALL·E 3生成图像
  • 小程序入门笔记(一) 黑马程序员前端微信小程序开发教程
  • 【进程管理】初识进程
  • ArcGIS Maps SDK for JS:监听按钮点击事件控制图层的visible属性
  • 微信小程序-1
  • 不容易解的题10.5
  • 后端面经学习自测(二)
  • 使用Jest测试Cesium源码
  • buuctf-[GXYCTF2019]禁止套娃 git泄露,无参数rce
  • 【逐步剖C】-第十一章-动态内存管理