热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:2018多校第十场HDU6430线段树合并

本文由编程笔记#小编为大家整理,主要介绍了2018多校第十场HDU6430线段树合并相关的知识,希望对你有一定的参考价值。题目链接:http://acm.hdu.e
本文由编程笔记#小编为大家整理,主要介绍了2018多校第十场 HDU 6430 线段树合并相关的知识,希望对你有一定的参考价值。


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

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

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

 


1 #include
2 using namespace std;
3 #define ll long long
4 #define ull unsigned long long
5 #define mst(a,b) memset((a),(b),sizeof(a))
6 #define mp(a,b) make_pair(a,b)
7 #define fi first
8 #define se second
9 #define pi acos(-1)
10 #define pii pair
11 #define pb push_back
12 const int INF = 0x3f3f3f3f;
13 const double eps = 1e-6;
14 const int MAXN = 1e5 + 10;
15 const int MAXM = 2e6 + 10;
16 const ll mod = 1e9 + 7;
17
18 vector<int>yz[MAXN],vec[MAXN];
19
20 void init() {
21 for(int i = 1; i ) {
22 for(int j = 1; j <= sqrt(i); j++) {
23 if(i % j == 0) {
24 yz[i].pb(j);
25 if(j != i / j) yz[i].push_back(i / j);
26 }
27 }
28 }
29 }
30
31 int root[MAXN];
32 int ls[MAXN * 400], rs[MAXN * 400], st[MAXN * 400];
33 int cnt = 0;
34
35 void pushup(int o) {
36 st[o] = max(st[ls[o]], st[rs[o]]);
37 }
38
39 void update(int k,int l,int r,int &o) {
40 if(!o) o = ++cnt;
41 if(l == r) {
42 st[o] = k;
43 return ;
44 }
45 int mid = (l + r) >> 1;
46 if(k <= mid) update(k, l, mid, ls[o]);
47 else update(k, mid + 1, r, rs[o]);
48 pushup(o);
49 }
50
51 int mergee(int fa,int u,int &ans) {
52 if(!fa || !u) return fa | u;
53 if(st[fa] == st[u]) ans = max(ans, st[fa]);
54 if(ls[fa] || ls[u]) ls[fa] = mergee(ls[fa], ls[u], ans);
55 if(rs[fa] || rs[u]) rs[fa] = mergee(rs[fa], rs[u], ans);
56 return fa;
57 }
58
59 int ans[MAXN];
60
61 void dfs(int u) {
62 for(int i = 0; i ) {
63 int v = vec[u][i];
64 dfs(v);
65 mergee(root[u], root[v], ans[u]);
66 }
67 }
68
69 int main() {
70 #ifdef local
71 freopen("data.txt", "r", stdin);
72 // freopen("data.txt", "w", stdout);
73 #endif
74 init();
75 int n;
76 scanf("%d",&n);
77 for(int i = 2; i <= n; i++) {
78 int f;
79 scanf("%d",&f);
80 vec[f].push_back(i);
81 }
82 for(int i = 1; i <= n; i++) {
83 int x;
84 scanf("%d",&x);
85 for(int j = 0; j )
86 update(yz[x][j], 1, 1e5, root[i]);
87 }
88 mst(ans, -1);
89 dfs(1);
90 for(int i = 1; i <= n; i++)
91 printf("%d
",ans[i]);
92 return 0;
93 }

 


推荐阅读
  • P2765魔术球问题这道题的思路实在是太罕见了,所以发一篇blog从某一新放入的球开始看起1.放入原来的柱子上2.放入新的柱子并将每个点进行拆点࿰ ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 题目描述Takuru是一名情报强者,所以他想利用他强大的情报搜集能力来当中间商赚差价。Takuru的计划是让Hinae帮他去市场上买一个商品,然后再以另一个价格卖掉它。Takur ... [详细]
  • DescriptionclickmeSolution套路的状压期望DP题。。。考虑倒退期望:设fi,jrolepresentationstyleposi ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了最长上升子序列问题的一个变种解法,通过记录拐点的位置,将问题拆分为左右两个LIS问题。详细讲解了算法的实现过程,并给出了相应的代码。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
author-avatar
传说中DE神
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有