Problem E. TeaTree - HDU - 6430 (树的启发式合并)
题意
有一棵树,每个节点有一个权值。
任何两个不同的节点都会把他们权值的\(gcd\)告诉他们的\(LCA\)节点。问每个节点被告诉的最大的数。
题解
第一次接触到树的启发式合并。
用一个set维护每个节点权值的因子。
自下而上,把每一个节点和所有儿子分别合并,记录他们的最大的\(gcd\)(即两个集合合并时找到的最大的公共因子),并更新答案即可。
计算因子的时候,如果你对于每个权值都找一遍因子,那么时间复杂度是\(n\sqrt{n}\)的。所以可以提前预处理,是\(n\log(n)\)的。
代码
#include <bits/stdc++.h>
#define FOPI freopen("in.txt", "r", stdin)
#define FOPO freopen("out.txt", "w", stdout)
using namespace std;
typedef long long LL;
const int maxn = 1e5 + 100;
int n;
set<int> S[maxn];
vector<int> v[maxn], Y[maxn];
int ans[maxn];
int merge(int x, int y)
{
int res = 0;
if (S[x].size() < S[y].size())
swap(S[x], S[y]);
for (int it : S[y])
{
if (S[x].count(it))
res = max(res, it);
else
S[x].insert(it);
}
S[y].clear();
return res;
}
void dfs(int x)
{
for (int y : v[x])
{
dfs(y);
ans[x] = max(ans[x], merge(x, y));
}
}
void init()
{
for (int i = 1; i <= 1e5; i++)
for (int j = i; j <= 1e5; j += i)
Y[j].push_back(i);
}
int main()
{
memset(ans, -1, sizeof(ans));
init();
int x;
scanf("%d", &n);
for (int i = 2; i <= n; i++)
scanf("%d", &x), v[x].push_back(i);
for (int i = 1; i <= n; i++)
{
scanf("%d", &x);
for (int j : Y[x]) S[i].insert(j);
}
dfs(1);
for (int i = 1; i <= n; i++) printf("%d\n", ans[i]);
}
Problem E. TeaTree - HDU - 6430 (树的启发式合并)的更多相关文章
- hdu 5893 (树链剖分+合并)
List wants to travel Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/O ...
- bzoj2733 永无乡 splay树的启发式合并
https://vjudge.net/problem/HYSBZ-2733 给一些带权点,有些点是互相连通的, 然后给出2种操作,在两点间加一条边,或者询问一个点所在的连通块内的第k小值的编号 并查集 ...
- bzoj 2809 左偏树\平衡树启发式合并
首先我们对于一颗树,要选取最多的节点使得代价和不超过m,那么我们可以对于每一个节点维护一个平衡树,平衡树维护代价以及代价的和,那么我们可以在logn的时间内求出这个子树最多选取的节点数,然后对于一个节 ...
- SPOJ:Free tour II (树分治+启发式合并)
After the success of 2nd anniversary (take a look at problem FTOUR for more details), this 3rd year, ...
- 【BZOJ3123】森林(主席树,启发式合并)
题意:一个带点权的森林,要求维护以下操作: 1.询问路径上的点权K大值 2.两点之间连边 n,m<=80000 思路:如果树的结构不发生变化只需要维护DFS序 现在因为树的结构发生变化,要将两棵 ...
- BZOJ3123[Sdoi2013]森林——主席树+LCA+启发式合并
题目描述 输入 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负 ...
- DSU模板(树的启发式合并)
摘自Codeforces博客 With dsu on tree we can answer queries of this type: How many vertices in subtree of ...
- 【CF778C】Peterson Polyglot(Trie树,启发式合并)
题意:有一棵n个结点的只由小写字母组成的Trie树,给定它的具体形态,问删除哪一层后剩下Trie树的结点数最少 n<=3e5 思路:先建出原Trie树,对于每一层的每一个结点计算删除后对答案的贡 ...
- [bzoj3123][Sdoi2013]森林_主席树_启发式合并
森林 bzoj-3123 Sdoi-2013 题目大意:给定一片共n个点的森林,T个操作,支持:连接两个不在一棵树上的两个点:查询一棵树上路径k小值. 注释:$1\le n,T \le 8\cdot ...
随机推荐
- SpringBoot | 第二十六章:邮件发送
前言 讲解了日志相关的知识点后.今天来点相对简单的,一般上,我们在开发一些注册功能.发送验证码或者订单服务时,都会通过短信或者邮件的方式通知消费者,注册或者订单的相关信息.而且基本上邮件的内容都是模版 ...
- 微信退款和支付宝退款接口调用(java版)
项目中需要使用到微信和支付宝的退款功能,在这两天研究了一下这两个平台的退款,有很多坑,在开发中需要留意 1.微信退款接口 相对来说我感觉微信的退款接口还是比较好调用的,直接发送httppost请求即可 ...
- OS进程同步与通信
信号量机制 信号量用于互斥 P(S) 临界区 V(S) ----- P(S) 临界区 V(S) 生产者消费者: typedef int semaphore //信号量值设置为1就是互斥量 semaph ...
- java-jsch实现sftp文件操作
(曾在天涯)的文章详细讲解了jsch中的函数以及用法 http://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html http://www. ...
- vue-pos : 子组件与子组件通讯
子组件与子组件通讯: 例子子组件1 要与子组件2 通讯 步骤1 : 在父组件新建一个 vue 对象 : const eventHub = new Vue() 步骤2 : 子组件1 发起事件 :this ...
- h5 本地存储
H5本地存储有两个API,一个是Web Storage,还有一个是Web SQL.不管是哪一个,都是基于JavaScript语言来使用,接下来我就教你怎么使用H5本地存储,本文篇幅较大,JS代码较多, ...
- 【Mood-13】Android --如何从初级工程师进化为高级工程师
一 明确自我定位 现在你是初级工程师,但是你想当个高级工程师,所 以,你就要给自己定个目标,即:我是要成为高级工程师的男人.有了这个定位,并且努力朝着这个目标去努力,然后内心深处就会有一个感觉,这个 ...
- spring 中使用quartz实现定时任务
一般开发系统,使用定时任务非常常见.当然也可以用Java实现.比如定时器.大致如下: 1: public static void main(String[] args) { 2: Timer time ...
- Windows Azure 入门 -- VS 2015部署 ASP.NET网站(项目) 与 数据库
Windows Azure 入门 -- 部署 ASP.NET网站(项目) 与数据库 https://www.dotblogs.com.tw/mis2000lab/2015/12/24/windowsa ...
- [转载]正则表达式参考文档 - Regular Expression Syntax Reference.
正则表达式参考文档 - Regular Expression Syntax Reference. [原创文章,转载请保留或注明出处:http://www.regexlab.com/zh/regref. ...