[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=1316

[算法]

点分治

由于边权较大,笔者在计算时使用了STL-set

注意当询问为0时,要输出"Yes"

[代码]

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define MAXN 10010
  4. #define MAXQ 110
  5.  
  6. struct Edge
  7. {
  8. int to,w,nxt;
  9. } e[MAXN<<];
  10.  
  11. int i,n,q,tot,root,u,v,w,len;
  12. int size[MAXN],head[MAXN],weight[MAXN],sum[MAXN],val[MAXN],a[MAXQ];
  13. bool visited[MAXN],ans[MAXQ];
  14.  
  15. inline void addedge(int u,int v,int w)
  16. {
  17. tot++;
  18. e[tot] = (Edge){v,w,head[u]};
  19. head[u] = tot;
  20. }
  21. inline void getroot(int u,int fa,int total)
  22. {
  23. int i,v;
  24. size[u] = ;
  25. weight[u] = ;
  26. for (i = head[u]; i; i = e[i].nxt)
  27. {
  28. v = e[i].to;
  29. if (fa != v && !visited[v])
  30. {
  31. getroot(v,u,total);
  32. size[u] += size[v];
  33. weight[u] = max(weight[u],size[v]);
  34. }
  35. }
  36. weight[u] = max(weight[u],total - size[u]);
  37. if (weight[u] < weight[root]) root = u;
  38. }
  39. inline void dfs(int u,int fa)
  40. {
  41. int i,v,w;
  42. val[++len] = sum[u];
  43. for (i = head[u]; i; i = e[i].nxt)
  44. {
  45. v = e[i].to;
  46. w = e[i].w;
  47. if (v != fa && !visited[v])
  48. {
  49. sum[v] = sum[u] + w;
  50. dfs(v,u);
  51. }
  52. }
  53. }
  54. inline void calc(int u)
  55. {
  56. int i,j,k,v,w;
  57. set< int > s;
  58. s.clear();
  59. s.insert();
  60. for (i = head[u]; i; i = e[i].nxt)
  61. {
  62. v = e[i].to;
  63. w = e[i].w;
  64. if (!visited[v])
  65. {
  66. sum[v] = w;
  67. len = ;
  68. dfs(v,u);
  69. for (j = ; j <= len; j++)
  70. {
  71. for (k = ; k <= q; k++)
  72. {
  73. if (s.find(a[k] - val[j]) != s.end())
  74. ans[k] = true;
  75. }
  76. }
  77. for (j = ; j <= len; j++) s.insert(val[j]);
  78. }
  79. }
  80. }
  81. inline void work(int u)
  82. {
  83. int i,v;
  84. visited[u] = true;
  85. calc(u);
  86. for (i = head[u]; i; i = e[i].nxt)
  87. {
  88. v = e[i].to;
  89. if (!visited[v])
  90. {
  91. root = ;
  92. getroot(v,,size[v]);
  93. work(root);
  94. }
  95. }
  96. }
  97.  
  98. int main()
  99. {
  100.  
  101. scanf("%d%d",&n,&q);
  102. for (i = ; i < n; i++)
  103. {
  104. scanf("%d%d%d",&u,&v,&w);
  105. addedge(u,v,w);
  106. addedge(v,u,w);
  107. }
  108. for (i = ; i <= q; i++) scanf("%d",&a[i]);
  109. root = ;
  110. size[] = weight[] = n;
  111. getroot(,,n);
  112. work(root);
  113. for (i = ; i <= q; i++) printf((ans[i] || a[i] == ) ? "Yes\n" : "No\n");
  114.  
  115. return ;
  116. }

[POJ 1316] 树上的询问的更多相关文章

  1. BZOJ 1316: 树上的询问( 点分治 + 平衡树 )

    直接点分治, 用平衡树(set就行了...)维护. -------------------------------------------------------------------------- ...

  2. BZOJ 1316: 树上的询问 (点分治+set)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1316 因为只要求存在某条路径长度为K,所以点分,然后用set判断差值是否在set中就可以了. ...

  3. BZOJ 1316: 树上的询问

    挺裸的点分治 刚开始想用map水过去,然后做p次点分治,然后T到自闭 最后发现可以sort一遍,然后去重,记录每个数出现的次数,这样就可以双指针,不会漏掉了 #include <bits/std ...

  4. [BZOJ1316]树上的询问 点分治

    1316: 树上的询问 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1017  Solved: 287[Submit][Status][Discus ...

  5. BZOJ_1316_树上的询问_点分治

    BZOJ_1316_树上的询问_点分治 Description 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. Input 第一行两个整 ...

  6. 【BZOJ1316】树上的询问 点分治+set

    [BZOJ1316]树上的询问 Description 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. Input 第一行两个整数n, ...

  7. [bzoj1316]树上的询问_点分治

    树上的询问 bzoj-1316 题目大意:一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. 注释:$1\le n\le 10^4$,$1\ ...

  8. POJ 1741 单次询问树上距离<=K的点对数 点分治

    #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; ; ], ...

  9. OpenJudge/Poj 1316 Self Numbers

    1.链接地址: http://poj.org/problem?id=1316 http://bailian.openjudge.cn/practice/1316 2.题目: 总时间限制: 1000ms ...

随机推荐

  1. 登录linux,输入ls显示anaconda-ks.cfg cobbler.ks ....., 原因在于root@ ~ / 区别

    今天登录linux测试机,想要创建目录,ls的时候,找不到之前的的目录,才发现是目录不对的问题. 首先,先要弄清楚 [root@330c353813ea ~] 和 [root@330c353813ea ...

  2. android随手记

    Linearlayout: gravity:本元素中所有子元素的重力方向     layout_gravity:本元素对于父元素的重力方向 自定义权限:http://www.cnblogs.com/i ...

  3. 安装pywin32

    1.下载pywin32:https://sourceforge.net/projects/pywin32/files/pywin32/ 2.安装: 安装过程中报错:Python version 2.7 ...

  4. Functor、Applicative 和 Monad(重要)

    Functor.Applicative 和 Monad Posted by 雷纯锋Nov 8th, 2015 10:53 am Functor.Applicative 和 Monad 是函数式编程语言 ...

  5. Language Integrated Query

    Language Integrated Query (LINQ, pronounced "link") is a Microsoft .NET Framework componen ...

  6. C# 获得指定路径扩展名 , 去除扩展名

    //指定扩展名的文件 private void button1_Click(object sender, EventArgs e) { textBox1.Text = ""; st ...

  7. Fear No More歌词

      "Fear No More"   Every anxious thought that steals my breath It's a heavy weight upon my ...

  8. 三维地图中的A*寻路

    跟二维地图原理一样,只不过搜索方向多了,二维只搜8个方向,而三维要搜26个方向. 不懂的看我以前写的文章,这里直接贴代码: #include <iostream> #include < ...

  9. Python笔记11------一个K-means聚类的小例子

    #导入scipy库,库中已经有实现的kmeans模块,直接使用, #根据六个人的分数分为学霸或者学渣两类 import numpy as np from scipy.cluster.vq import ...

  10. nyoj329-循环小数

    329-循环小数 内存限制:64MB时间限制:3000msSpecial Judge: No accepted:1submit:1 题目描述: 我们可爱的 c小加 近段儿正在潜心研究数学,当他学习到循 ...