题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6430

题意:一棵树上每个节点权值为v[i],每个节点的heard值是:以它为LCA的两个节点的GCD的最大值,要求输出每个节点的heard值。

题解:权值范围是[1, 1e5],1e5内数因子最多不超过200个,对每个点建一颗线段树,维护每个点的因子,dfs过程中由下往上合并线段树并更新答案。

 #include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset((a),(b),sizeof(a))
#define mp(a,b) make_pair(a,b)
#define fi first
#define se second
#define pi acos(-1)
#define pii pair<int,int>
#define pb push_back
const int INF = 0x3f3f3f3f;
const double eps = 1e-;
const int MAXN = 1e5 + ;
const int MAXM = 2e6 + ;
const ll mod = 1e9 + ; vector<int>yz[MAXN],vec[MAXN]; void init() {
for(int i = ; i < MAXN; i++) {
for(int j = ; j <= sqrt(i); j++) {
if(i % j == ) {
yz[i].pb(j);
if(j != i / j) yz[i].push_back(i / j);
}
}
}
} int root[MAXN];
int ls[MAXN * ], rs[MAXN * ], st[MAXN * ];
int cnt = ; void pushup(int o) {
st[o] = max(st[ls[o]], st[rs[o]]);
} void update(int k,int l,int r,int &o) {
if(!o) o = ++cnt;
if(l == r) {
st[o] = k;
return ;
}
int mid = (l + r) >> ;
if(k <= mid) update(k, l, mid, ls[o]);
else update(k, mid + , r, rs[o]);
pushup(o);
} int mergee(int fa,int u,int &ans) {
if(!fa || !u) return fa | u;
if(st[fa] == st[u]) ans = max(ans, st[fa]);
if(ls[fa] || ls[u]) ls[fa] = mergee(ls[fa], ls[u], ans);
if(rs[fa] || rs[u]) rs[fa] = mergee(rs[fa], rs[u], ans);
return fa;
} int ans[MAXN]; void dfs(int u) {
for(int i = ; i < vec[u].size(); i++) {
int v = vec[u][i];
dfs(v);
mergee(root[u], root[v], ans[u]);
}
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
init();
int n;
scanf("%d",&n);
for(int i = ; i <= n; i++) {
int f;
scanf("%d",&f);
vec[f].push_back(i);
}
for(int i = ; i <= n; i++) {
int x;
scanf("%d",&x);
for(int j = ; j < yz[x].size(); j++)
update(yz[x][j], , 1e5, root[i]);
}
mst(ans, -);
dfs();
for(int i = ; i <= n; i++)
printf("%d\n",ans[i]);
return ;
}

最新文章

  1. 部署点评Cat监控项目(转)
  2. .net_ckeditor+ckfinder的图片上传配置
  3. sql 字符次数
  4. 【洛谷 p3382】模板-三分法(算法效率)
  5. Eclipse发布地址不同引发的问题
  6. pthread_detach pthread_join pthread_create
  7. Linux 查找文件方法
  8. 迭代器(iterators)
  9. Codeforces Beta Round #10 B. Cinema Cashier (树状数组)
  10. XTU 1250 Super Fast Fourier Transform
  11. window环境变量
  12. 通过RMAN克隆11g数据库(基于active database)
  13. Android-动态权限获取
  14. PHP语言在中国的发展前景怎么样?
  15. hdu 1540 Tunnel Warfare (线段树 区间合并)
  16. python import win32clipboard 报错DLL load failed: %1 不是有效的 Win32 应用程序。
  17. Vmware Horizon 服务器替换 ssl 证书
  18. 【TP3.2】:日志记录和查看
  19. 修改系统时间为UTC时间
  20. 「清华集训2015」V

热门文章

  1. PTA(Advanced Level)1033.To Fill or Not to Fill
  2. 导出远程oracle数据库到本地
  3. 服务器做raid1后安装windows server 2012遇到的问题
  4. 【AtCoder】ARC064
  5. WPF入门(2)——数据绑定与INotifyPropertyChanged(INPC)
  6. k8s-traefik默认80端口
  7. vue插件总结——总有你能用上的插件
  8. 怎样理解 display:none 和 visibility:hidden
  9. 1、windows安装npm教程 --参考自https://www.cnblogs.com/jianguo221/p/11487532.html
  10. docker 第四篇 网络