HDU - 6430 Problem E. TeaTree 2018 Multi-University Training Contest 10 (LCA+枚举因子)
题意:一棵树,每个点都有自己val(1 <= val <= 1e5),而任意两个点u,v可以对lca(u,v) 产生gcd(valu,valv)的贡献,求每个点能接受到来自子树贡献的最大值。
分析:一个数w和其整数数倍的数gcd值还是w。记录每个值对应树的下标,枚举1- max{val}中的数,遍历其整数倍中两两结点的lca,检查其是否需要被更新。
其中遍历LCA的操作并不用二重循环枚举顶点,可以将顶点按dfs序排序后遍历其中相邻两点的LCA。
这里使用了RMQ的方式O(1) 查询LCA。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+;
struct node{
int v,next;
}edges[N<<];
int head[N],e;
int id[N];
int RMQ[N*][];
int curID;
int F[N*],B[N*];
int n,m,Q,root;
int val[N];
int res[N];
vector<int> num[N];
int mx; void init(){
e = ; curID = ;
memset(head,-,sizeof(head));
for(int i=;i<N;++i) num[i].clear();
} void Add (int u,int v)
{
edges[e].v=v;
edges[e].next=head[u];
head[u]=e++;
} void DFS (int u,int p,int Dep)
{
int i,v;
curID++;
F[curID]=u;
B[curID]=Dep;
id[u]=curID;
for (i=head[u];i!=-;i=edges[i].next){
v=edges[i].v;
if (v==p) continue;
DFS(v,u,Dep+);
curID++;
F[curID]=u;
B[curID]=Dep;
}
} void initRMQ()
{
int i,j,x,y;
for (i=;i<=curID;i++)
RMQ[i][]=i;
for (j=;(<<j)<=curID;j++)
for (i=;i+(<<j)-<=curID;i++){
x=RMQ[i][j-];
y=RMQ[i+(<<(j-))][j-];
RMQ[i][j]=B[x]<B[y]?x:y;
}
} int getLCA (int a,int b)
{
int k,x,y;
a=id[a];b=id[b];
if (a>b) k=a,a=b,b=k;
k = - __builtin_clz(b - a + );
x=RMQ[a][k];
y=RMQ[b-(<<k)+][k];
return B[x]<B[y]?F[x]:F[y];
} void gao(int w)
{
vector<int> p;
for(int i=w;i<=mx;i+=w){
for(auto &v:num[i]){
p.push_back(v);
}
}
sort(p.begin(),p.end(),[&](int x,int y){return id[x]<id[y];});
for(int i=;i<p.size();++i){
int lca= getLCA(p[i],p[i-]);
res[lca] = max(res[lca],w);
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int N;
while(~scanf("%d",&N)){
init();
memset(res,-,sizeof(res));
int u,v,tmp;
for(int i=;i<=N;++i){
scanf("%d",&u);
Add(u,i);
Add(i,u);
}
DFS(,-,);
initRMQ();
mx = -;
for(int i=;i<=N;++i){
scanf("%d",&val[i]);
mx = val[i]>mx? val[i] : mx;
num[val[i]].push_back(i);
}
for(int i=mx;i>=;--i)
gao(i);
for(int i=;i<=N;++i)
printf("%d\n",res[i]);
}
return ;
}
HDU - 6430 Problem E. TeaTree 2018 Multi-University Training Contest 10 (LCA+枚举因子)的更多相关文章
- HDU 6430 Problem E. TeaTree(虚树)
Problem E. TeaTree Problem Description Recently, TeaTree acquire new knoledge gcd (Greatest Common D ...
- HDU - 6435 Problem J. CSGO 2018 Multi-University Training Contest 10 (二进制枚举+思维)
题意:有N个主武器(MW)和M个副武器(SW),每个武器都有自己的S值,和K个附加属性xi.要选取一对主副武器搭配,搭配后获得的性能由该公式得出: 求获得最大的性能为多少. 分析:由于|xm - xs ...
- 2018 Nowcoder Multi-University Training Contest 10
Practice Link J. Rikka with Nickname 题意: 给出\(n\)个字符串,要求依次合并两个串\(s, t\),满足将\(t\)合并到\(s\)中变成\(r\),使得\( ...
- hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)
CRB and Tree Time Limit: 8000/4000 MS (J ...
- 2015 Multi-University Training Contest 10 hdu 5406 CRB and Apple
CRB and Apple Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- 2015 Multi-University Training Contest 10 hdu 5412 CRB and Queries
CRB and Queries Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- 2018 Multi-University Training Contest 10 Solution
A - Problem A.Alkane 留坑. B - Problem B. Beads 留坑. C - Problem C. Calculate 留坑. D - Problem D. Permut ...
- HDU 6141 - I am your Father! | 2017 Multi-University Training Contest 8
思路来自 FXXL 最小树形图模板用kuangbin的 /* HDU 6141 - I am your Father! [ 最小树形图 ] | 2017 Multi-University Traini ...
- HDU - 6437 Problem L.Videos 2018 Multi-University Training Contest 10 (最小费用最大流)
题意:M个影片,其属性有开始时间S,结束时间T,类型op和权值val.有K个人,每个人可以看若干个时间不相交的影片,其获得的收益是这个影片的权值val,但如果观看的影片相邻为相同的属性,那么收益要减少 ...
随机推荐
- libxl库的介绍,对Excel操作封装得很好的一个库,兼容2007版和多字节字符(最后有破解版下载)
前段时间忙着毕业论文,终于有时间写博客了. 早些时候老大给我的一个任务需要对excel进行读表操作,研究了一下c++对excel的操作. 对Excel的操作基本有com,ODBC,AD等,其中ODBC ...
- 第一百四十节,JavaScript,封装库--浏览器检测
JavaScript,封装库--浏览器检测 在函数库编写一个,浏览器检测对象 /** sys浏览器检测对象,对象下有两个属性,liu_lan_qi属性和xi_tong属性 * liu_lan_qi属性 ...
- Java1.0的AWT(旧AWT)和Java1.1以后的AWT(新AWT)有着很大的区别
Java1.0的AWT(旧AWT)和Java1.1以后的AWT(新AWT)有着很大的区别,新的AWT克服了旧AWT的很多缺点,在设计上有较大改进,使用也更方便,这里主要介绍新的AWT, 但在Java1 ...
- 竞赛图的得分序列 (SRM 717 div 1 250)
SRM 717 DIV 1 中 出了这样一道题: 竞赛图就是把一个无向完全图的边定向后得到的有向图,得分序列就是每个点的出度构成的序列. 给出一个合法的竞赛图出度序列, 要求构造出原图(原题是求(u, ...
- Linux动态库搜索路径的技巧
众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib.动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库,并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径 ...
- 【ARDUINO】串口无法打开问题
1.查看是否串口被锁 sudo arduino ls /var/lock sudo rm /var/lock/LCK..ttyACM* 2.查看arduino安装位置 dpkg -S XXXX 3.原 ...
- PHP和JS判断手机还是电脑访问
当用户使用手机等移动终端访问网站时,我们可以通过程序检测用户终端类型,如果是手机用户,则引导用户访问适配手机屏幕的移动站点.本文将介绍分别使用PHP和JAVASCRIPT代码判断用户终端类型. PHP ...
- css中div高度自适应
高度的自适应(父div高度随子div的高度改变而改变) 1.如果父div不定义height.子div均为标准流的时候,父div的height随内容的变化而变化,实现父div高度随子div的高度改变而改 ...
- 编写高质量代码–改善python程序的建议(五)
原文发表在我的博客主页,转载请注明出处! 建议二十三:遵循异常处理的几点基本原则 python中常用的异常处理语法是try.except.else.finally,它们可以有多种组合,语法形式如下: ...
- 【BZOJ1189】[HNOI2007]紧急疏散evacuate 动态加边网络流
[BZOJ1189][HNOI2007]紧急疏散evacuate Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空 ...