Problem GCD Tree

题目大意

  n个点的无向完全图,标号1~n,每条边u-->v 的权值为gcd(u,v),求其最大生成树,输出最大边权和。

  n<=10^5,有多个询问。  

解题分析

  从小到大加入每个点,计算其对答案的贡献。

  对于一个点i,只有向它的约数连边才有可能对答案有贡献。

  用lct维护一棵最大生成树即可。

参考程序

  1. #include <map>
  2. #include <set>
  3. #include <stack>
  4. #include <queue>
  5. #include <cmath>
  6. #include <ctime>
  7. #include <string>
  8. #include <vector>
  9. #include <cstdio>
  10. #include <cstdlib>
  11. #include <cstring>
  12. #include <cassert>
  13. #include <iostream>
  14. #include <algorithm>
  15. #pragma comment(linker,"/STACK:102400000,102400000")
  16. using namespace std;
  17.  
  18. #define N 400008
  19. #define M 50008
  20. #define LL long long
  21. #define lson l,m,rt<<1
  22. #define rson m+1,r,rt<<1|1
  23. #define clr(x,v) memset(x,v,sizeof(x));
  24. #define bitcnt(x) __builtin_popcount(x)
  25. #define rep(x,y,z) for (int x=y;x<=z;x++)
  26. #define repd(x,y,z) for (int x=y;x>=z;x--)
  27. const int mo = ;
  28. const int inf = 0x3f3f3f3f;
  29. const int INF = ;
  30. /**************************************************************************/
  31. const int maxn = ;
  32. vector <int> p[N];
  33.  
  34. int n,m;
  35. int fa[N],val[N],mn[N],rev[N],c[N][],st[N],ln[N],rn[N];
  36. LL ans[maxn];
  37.  
  38. bool isroot(int k){
  39. return c[fa[k]][]!=k && c[fa[k]][]!=k;
  40. }
  41. void pushup(int x){
  42. int l=c[x][],r=c[x][];
  43. mn[x]=x;
  44. if (val[mn[l]]<val[mn[x]]) mn[x]=mn[l];
  45. if (val[mn[r]]<val[mn[x]]) mn[x]=mn[r];
  46. }
  47. void pushdown(int x){
  48. int l=c[x][],r=c[x][];
  49. if (rev[x]){
  50. if (l) rev[l]^=;
  51. if (r) rev[r]^=;
  52. rev[x]^=;
  53. swap(c[x][],c[x][]);
  54. }
  55. }
  56. void rotate(int x){
  57. int y=fa[x],z=fa[y],l,r;
  58. if (c[y][]==x) l=; else l=; r=l^;
  59. if (!isroot(y)){
  60. if (c[z][]==y) c[z][]=x; else c[z][]=x;
  61. }
  62. fa[x]=z; fa[y]=x; fa[c[x][r]]=y;
  63. c[y][l]=c[x][r]; c[x][r]=y;
  64. pushup(y); pushup(x);
  65. }
  66. void splay(int x){
  67. int top=; st[++top]=x;
  68. for (int i=x;!isroot(i);i=fa[i]) st[++top]=fa[i];
  69. while (top) pushdown(st[top--]);
  70. while (!isroot(x)){
  71. int y=fa[x],z=fa[y];
  72. if (!isroot(y)){
  73. if (c[y][]==x^c[z][]==y) rotate(x);
  74. else rotate(y);
  75. }
  76. rotate(x);
  77. }
  78. }
  79. void access(int x){
  80. int t=;
  81. while (x){
  82. splay(x);
  83. c[x][]=t;
  84. pushup(x);
  85. t=x; x=fa[x];
  86. }
  87. }
  88. void rever(int x){
  89. access(x); splay(x); rev[x]^=;
  90. }
  91. void link(int u,int v){
  92. rever(u); fa[u]=v;
  93. }
  94. void cut(int u,int v){
  95. rever(u); access(v); splay(v); fa[c[v][]]=; c[v][]=; pushup(v);
  96. }
  97. int find(int u){
  98. access(u); splay(u);
  99. while (c[u][]) u=c[u][];
  100. return u;
  101. }
  102. int query(int u,int v){
  103. rever(u); access(v); splay(v); return mn[v];
  104. }
  105. int main(){
  106. for (int i=;i<=maxn;i++)
  107. for (int j=i;j<=maxn;j+=i)
  108. p[j].push_back(i);
  109. int now=;
  110. val[]=INF;
  111. rep(i,,maxn){
  112. val[++now]=INF;
  113. mn[now]=now;
  114. }
  115. ans[]=;
  116. LL tmp=;
  117. for (int u=;u<=maxn;u++){
  118. for (int i=p[u].size()-;i>=;i--)
  119. {
  120. int v=p[u][i];
  121. int flag=;
  122. if (find(u)==find(v)){
  123. int t=query(u,v);
  124. if (v>val[t]){
  125. cut(ln[t],t);
  126. cut(rn[t],t);
  127. tmp-=val[t];
  128. flag=;
  129. }
  130. else flag=;
  131. }
  132. if (flag){
  133. mn[++now]=now; val[now]=v; ln[now]=u; rn[now]=v;
  134. link(now,u); link(now,v);
  135. tmp+=v;
  136. }
  137. }
  138. ans[u]=tmp;
  139. }
  140. while (~scanf("%d",&n)){
  141. printf("%lld\n",ans[n]);
  142. }
  143. }

HDU 5398 (动态树)的更多相关文章

  1. hdu 5398 动态树LCT

    GCD Tree Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  2. hdu 5002 (动态树lct)

    Tree Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  3. hdu 5314 动态树

    Happy King Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Tot ...

  4. hdu 4010 动态树 @

    kuangbin模板题,看起来十分高大上 /* *********************************************** Author :kuangbin Created Tim ...

  5. HDU 2475 BOX 动态树 Link-Cut Tree

    Box Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) [Problem De ...

  6. HDU 4010 Query on The Trees (动态树)(Link-Cut-Tree)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4010 题意; 先给你一棵树,有 \(4\) 种操作: 1.如果 \(x\) 和 \(y\) 不在同一 ...

  7. HDU 4836 The Query on the Tree lca || 欧拉序列 || 动态树

    lca的做法还是非常明显的.简单粗暴, 只是不是正解.假设树是长链就会跪,直接变成O(n).. 最后跑的也挺快,出题人还是挺阳光的.. 动态树的解法也是听别人说能ac的.预计就是放在splay上剖分一 ...

  8. HDU 4718 The LCIS on the Tree (动态树LCT)

    The LCIS on the Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Oth ...

  9. 动态树LCT小结

    最开始看动态树不知道找了多少资料,总感觉不能完全理解.但其实理解了就是那么一回事...动态树在某种意思上来说跟树链剖分很相似,都是为了解决序列问题,树链剖分由于树的形态是不变的,所以可以通过预处理节点 ...

  10. 如何利用FineReport制作动态树报表

    在对数据字段进行分类管理时,利用动态树折叠数据是一个很好的方法,也就是点击数据前面的加号才展开对应下面的数据,如下图.那这样的效果在制作报表时该如何实现呢? 下面以报表工具FineReport为例介绍 ...

随机推荐

  1. jquery.fullPage.js全屏滚动插件教程演示

    css部分(此处需要导入jquery.fullPage.css) <style> .section { text-align: center; font: 50px "Micro ...

  2. 我的毕业设计——基于安卓和.NET的笔记本电脑远程控制系统

    手机端: 电脑端:    答辩完成后会开放代码.

  3. 今天遇到了批量删除 redis 某个前缀的所有 key,发现只能是这么解决。

    redis-cli KEYS "php*" | xargs redis-cli DEL 利用 linux的 管道输出命令 xargs 根据返回结果逐条 删除.   上面这条命令 可 ...

  4. nginx 配置ci ,tp

    #local ciserver {    listen       80;    server_name  ci.local;        root    E:/test/CodeIgniter/; ...

  5. ECMAScript6 面向对象 时钟效果

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. js归并排序法

    function mergeSort(arr) { var len = arr.length; if(len > 1) { var index = Math.floor(len / 2); le ...

  7. bzoj2141 树状数组套Treap树

    题目大意是在能够改变两个数的位置的情况下计算逆序对数 这因为是动态记录逆序对 本来单纯逆序对只要用树状数组计算即可,但这里因为更新,所以利用TReap树的删点和增加点来进行更新 大致是把每个树状数组所 ...

  8. 搬运:Python for Windows——监控Windows某个目录下文件的变化

    https://win32com.goermezer.de/content/view/286/285/ 这个网站真是给力,不多说,代码直接搬运过来,还有我的测试结果,拿走不谢! import os i ...

  9. 嵌入式 python异常except语句用法与引发异常 zz

    http://blog.sina.com.cn/s/blog_8795b0970101dj0a.html

  10. golang实现随机数

    package main import ( "fmt" "time" "math/rand" ) func main() { r := ra ...