题目链接: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 ;
}

2018多校第十场 HDU 6430 (线段树合并)的更多相关文章

  1. 2018 CCPC 吉林站 H Lovers || HDU 6562 (线段树哦)

    http://acm.hdu.edu.cn/showproblem.php?pid=6562 题意: q次操作 1.将第l~r个数的左边和和右边都加上一个数d, 使得这个数变成 dsiddsid的形式 ...

  2. 【HDU】4092 Nice boat(多校第四场1006) ——线段树 懒惰标记

    Nice boat Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) To ...

  3. hdu 6430 线段树 暴力维护

    Problem E. TeaTree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  4. Explorer(2019年牛客多校第八场E题+线段树+可撤销并查集)

    题目链接 传送门 题意 给你一张无向图,每条边\(u_i,v_i\)的权值范围为\([L_i,R_i]\),要经过这条边的条件是你的容量要在\([L_i,R_i]\),现在问你你有多少种容量使得你可以 ...

  5. 2019牛客多校第四场B xor——线段树&&线性基的交

    题意 给你 $n$ 个集合,每个集合中包含一些整数.我们说一个集合表示一个整数当且仅当存在一个子集其异或和等于这个整数.现在你需要回答 $m$ 次询问 ($l, r, x$),是否 $l$ 到 $r$ ...

  6. 2019牛客多校第七场C-Governing sand(线段树+枚举)

    Governing sand 题目传送门 解题思路 枚举每一种高度作为最大高度,则需要的最小花费的钱是:砍掉所有比这个高度高的树的所有花费+砍掉比这个高度低的树里最便宜的m棵树的花费,m为高度低的里面 ...

  7. 2018.10.26 NOIP模拟 图(最小生成树+线段树合并)

    传送门 首先最开始说的那个一条路径的权值就是想告诉你两个点之间的贡献就是瓶颈边的权值. 那么肯定要用最小生成树算法. 于是我考场上想了30min+30min+30min+的树形dpdpdp 发现转移是 ...

  8. 2018.08.27 [Usaco2017 Jan]Promotion Counting(线段树合并)

    描述 The cows have once again tried to form a startup company, failing to remember from past experienc ...

  9. 2017多校第8场 HDU 6133 Army Formations 线段树合并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6133 题意:给你一棵n个节点的二叉树,每个节点有一个提交任务的时间,每个节点总的提交任务的罚时为:提交 ...

随机推荐

  1. Design Circular Deque

    Design your implementation of the circular double-ended queue (deque). Your implementation should su ...

  2. mac 环境下mysql登陆失败问题Access denied for user 'root'@'localhost' (using passwordYES)

    1.停止mysql服务 sudo /usr/local/mysql/support-files/mysql.server stop 2.进入mysql的bin目录 cd /usr/local/mysq ...

  3. 关于SpringMVC中的转发与重定向的说明

    写的非常详细,参看该地址:https://www.zifangsky.cn/661.html 总结: 1.请求转发:url地址不变,可带参数,如?username=forward 2.请求重定向:ur ...

  4. MyBatis使用小结

  5. Ubuntu 18.04修改默认源为国内源

    安装Ubuntu 18.04后,使用国外源太慢了,修改为国内源会快很多. 修改阿里源为Ubuntu 18.04默认的源 备份/etc/apt/sources.list 备份 cp /etc/apt/s ...

  6. window下 php7+apache2搭建

    一.下载php7和apache2.4 首先下载php7的windows压缩包,到这里下载http://windows.php.net/download/ Php7  VC14 x86 Thread S ...

  7. 牛客 216D 消消乐 (二分图最小点覆盖)

    大意: 给定棋盘, 每次消除一行或一列, 求最小次数使得消除完所有'*'. 裸的二分图最小点覆盖. 二分图的最小点覆盖等于最大匹配, 输出方案时从所有左部未盖点开始标记交替路上的点, 最后左部所有未标 ...

  8. MySQL 聚合函数(四)检测功能依赖

    源自MySQL 5.7 官方手册:12.20.4 Detection of Functional Dependence 本节提供了MySQL检测功能依赖的方式的几个示例.这些示例使用此表示法: {X} ...

  9. GoBelieve service部署问题整理

  10. Vue-img-preload

    预加载页面上的图片资源,提高用户体验 效果预览 使用方法 下载vue-img-preload插件 npm install vue-img-preload 配置参数 eachLoaded(functio ...