http://gdutcode.sinaapp.com/problem.php?cid=1056&pid=5

Description

有一棵树,树上有只tmk。他在这棵树上生活了很久,对他的构造了如指掌。所以他在树上从来都是走最短路,不会绕路。他还还特别喜欢三角形,所以当他在树上爬来爬去的时候总会在想,如果把刚才爬过的那几根树枝/树干锯下来,能不能从中选三根出来拼成一个三角形呢?

Input

第一行输入一个T,表示有多少组样例。

对于每组数据:第一行包含一个整数 N,表示树上节点的个数(从 1 到 N 标号)。

接下来的 N-1 行包含三个整数 a, b, len,表示有一根长度为 len 的树枝/树干在节点 a 和节点 b 之间。

接下来一行包含一个整数 M,表示询问数。

接下来M行每行两个整数 S, T,表示毛毛虫从 S 爬行到了 T,询问这段路程中的树枝/树干是否能拼成三角形。

Output

对于每组数据,每个询问输出一行,包含"Yes"或“No”,表示是否可以拼成三角形。

Sample Input

2 5 1 2 5 1 3 20 2 4 30 4 5 15 2 3 4 3 5 5 1 4 32 2 3 100 3 5 45 4 5 60 2 1 4 1 3

Sample Output

No Yes No Yes

HINT

对于20%数据 1 ≤ N, M ≤ 1000

对于所有数据 1 ≤ N ≤ 100000, 1 ≤ M ≤ 100000, 1 ≤ len ≤ 1000000000

一道脑洞巨大无比的题目:

假设现在有 n 条线段, 假设 n 条边从小到达排序, 如果这 n 条边中没有三条可以构成
三角形, 那么这 n 条边必须满足关系: A[i] >= A[i-2]+A[i-1], 这里的 A[i]表示第 i 条边的大小。
假设 A[i]尽量取最小 A[i]=A[i-2]+A[i-1], 且 A[1]=A[2]=1, 是不是就是一个斐波那契, 也就
是对于一个 n 条边的集合, 如果不存在三条边能构成一个三角形, 那么最长的边至少为 f[n],
表示斐波那契第 n 项。 而题目中 A[i]<1e9, 也就是只要 n>50, 就必定存在三条边可以构成一
个三角形, 所以我们只需要暴力加入两点路径上的边( 如果大于 50, 直接 Yes) , 然后对这
些边进行排序, 枚举第 i 条边为最长边, 贪心判断 A[i]是否小于 A[i-1]+A[i-2]即可

其实和这道题目是一模一样的:

http://hzwer.com/4896.html

下面的代码为了避免每次查询时都DFS一遍,使用了LCA优化了(最朴素的LCA算法)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 100000;
  4. int cnt = 1;
  5. struct edge
  6. {
  7. int y, val;
  8. int nxt;
  9. };
  10. edge tree[MAXN * 3];
  11. int head[MAXN];
  12. void addedge(int a, int b, int val)
  13. {
  14. tree[cnt].y = b, tree[cnt].val = val;
  15. tree[cnt].nxt = head[a];
  16. head[a] = cnt++;
  17. }
  18. int dpt[MAXN], fa[MAXN],len[MAXN];
  19. void dfs(int id)
  20. {
  21. dpt[id] = dpt[fa[id]] + 1;
  22. int tmp = head[id];
  23. for (; tmp; tmp = tree[tmp].nxt) {
  24. if (tree[tmp].y != fa[id]) {
  25. fa[tree[tmp].y]=id;
  26. dfs(tree[tmp].y);
  27. }
  28. else{
  29. len[id]=tree[tmp].val;
  30. }
  31. }
  32. return ;
  33. }
  34. int e[MAXN];
  35. int top;
  36. bool check(int a, int b)
  37. {
  38. top = 0;
  39. if (dpt[a] < dpt[b]) swap(a, b);
  40. while (dpt[a] > dpt[b]) {
  41. e[++top]=len[a];
  42. if(top>=50) return false;
  43. a=fa[a];
  44. }
  45. while(a!=b){
  46. e[++top]=len[a];
  47. e[++top]=len[b];
  48. if(top>=50) return false;
  49. a=fa[a];
  50. b=fa[b];
  51. }
  52. sort(e+1,e+top+1);
  53. for(int i=1;i<=top-2;i++){
  54. if(e[i]+e[i+1]>e[i+2]) return true;
  55. }
  56. return false;
  57. }
  58. void init()
  59. {
  60. cnt=1;
  61. memset(dpt,0,sizeof(dpt));
  62. memset(head,0,sizeof(head));
  63. memset(fa,0,sizeof(fa));
  64. len[1]=0;
  65. fa[1]=0;
  66. }
  67. int main()
  68. {
  69. //freopen("data.in","r",stdin);
  70. int t;
  71. int n, a, b, le;
  72. scanf("%d", &t);
  73. while (t--) {
  74. init();
  75. scanf("%d", &n);
  76. for (int i = 0; i < n-1; i++) {
  77. scanf("%d%d%d", &a, &b, &le);
  78. addedge(a, b, le);
  79. addedge(b, a, le);
  80. }
  81. dfs(1);
  82. int m;
  83. scanf("%d", &m);
  84. for (int i = 0; i < m; i++) {
  85. scanf("%d%d", &a, &b);
  86. if (check(a, b))
  87. printf("Yes\n");
  88. else
  89. printf("No\n");
  90. }
  91. }
  92. }

广工2017校赛-F-- tmk找三角的更多相关文章

  1. 2017校赛 问题 F: 懒人得多动脑

    题目描述 小D的家A和学校B都恰好在以点F为焦点的双曲线上,而小D每日所需的生活水源在一条平行该双曲线准线的直线上,设它的值为v.大家都知道,每天都是要喝水的,但是小D有点懒,他希望自己能在去上学或者 ...

  2. 校赛F

    问题描述 例如对于数列[1 2 3 4 5 6],排序后变为[6 1 5 2 4 3].换句话说,对于一个有序递增的序列a1, a2, a3, ……, an,排序后为an, a1, an-1, a2, ...

  3. 校赛F 比比谁更快(线段树)

    http://acm.cug.edu.cn/JudgeOnline/problem.php?cid=1153&pid=5 题意:给你一个字符串,各两个操作: ch=0,[l,r]降序 ch=1 ...

  4. 上海高校金马五校赛 F题:1 + 2 = 3?

    链接:https://www.nowcoder.com/acm/contest/91/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言26214 ...

  5. xdu2017校赛F

    Problem F Dogs of Qwordance Senior Backend R&D Engineers 问题描述 那年夏天,锘爷和杰师傅漫步在知春公园的小道上.他们的妻子.孩子牵 着 ...

  6. 浙江理工2015.12校赛-F Landlocked

    Landlocked Time Limit: 5 Sec Memory Limit: 128 MB Submit: 288 Solved: 39 Description Canada is not a ...

  7. 广州工业大学2016校赛 F 我是好人4 dfs+容斥

    Problem F: 我是好人4 Description 众所周知,我是好人!所以不会出太难的题,题意很简单 给你n个数,问你1000000000(含1e9)以内有多少个正整数不是这n个数任意一个的倍 ...

  8. 郑轻校赛 2127 tmk射气球 (数学)

    Description 有一天TMK在做一个飞艇环游世界,突然他发现有一个气球匀速沿直线飘过,tmk想起了他飞艇上有一把弓,他打算拿弓去射气球,为了提高射击的准确性,他首先在飞艇上找到一个离气球最近的 ...

  9. 北邮校赛 F. Gabriel's Pocket Money(树状数组)

    F. Gabriel's Pocket Money 2017- BUPT Collegiate Programming Contest - sync 时间限制 2000 ms 内存限制 65536 K ...

随机推荐

  1. 坦克大战--Java类型 ---- (3)实现socket通信

    一.实现思路 使用socket通信的一些方法来实现socket通信,客户端和服务端两边需要约定好通信的接口Port(尽量选高的),客户端需要服务端的IP地址,以实现数据交流. 同时,客户端和服务端需要 ...

  2. 2019中山纪念中学夏令营-Day20[JZOJ] T1旅游详解

    2019中山纪念中学夏令营-Day20[JZOJ] 提高组B组 Team_B组 T1 旅游 Time Limits: 2000 ms  Memory Limits: 262144 KB Descrip ...

  3. Spring经典高频面试题,原来是长这个样子

    Spring经典高频面试题,原来是长这个样子 2019年08月23日 15:01:32 博文视点 阅读数 719   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文 ...

  4. SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum

    SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum avg() 函数 定义和用法 AVG 函数返回数值列的平均值.NULL ...

  5. O024、Nova组件如何协同工作

    参考https://www.cnblogs.com/CloudMan6/p/5415836.html   Nova 物理部署方案   前面大家已经看到 Nova 由很多子服务组成,我们也知道OpenS ...

  6. Java APi 之 RMI远程方法调用

    一.什么是RPC RPC全称是remote procedure call,即远程过程调用.它是一种协议,用于从远程计算机上请求服务. 例如有两台服务器A和B,A上的应用想要调用B上应用的方法,但是他们 ...

  7. pat(B)_1001

    1001 害死人不偿命的(3n+1)猜想 (15 分) 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 (3n+1) 砍掉一半.这样一直反复 ...

  8. python、第三篇:表相关操作

    一 存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制 详见:https://www.cnblogs.com/Forever-x/p/11317479.html 二 表介绍 ...

  9. 六,k8s集群service资源

    目录 Service简介 ClusterIP Headless(无头service) NodePort Service简介 service的基本说明: Service 是作用于客户端可服务端(Pod) ...

  10. 在vs上开发linux c++

    https://www.cnblogs.com/xylc/p/6533716.html?&from=androidqq https://www.jianshu.com/p/8b51a795cb ...