题意:一个n个点的树,询问某两点之间的简单路径,问路径上任选三边能否组成一个三角形。 N<100000,权值<109

思路:

这里最神奇的思路过于以下这个:

n个数,任意三个都不能组成三角形,只有当:

排序A,且A[i] >= A[i-1] + A[i-2];

观察可以发现其增长类似斐波那契,又因为权值<109,所以当路径里边的个数>=45个时,必然可以组成三角形。

剩下的,就暴力一下就好了。

确定路径边的个数的方法是深度结合lca来做。暴力的话就是两点向上攀,直到公共祖先。然后sort一下,然后检查是否存在 A[i] < A[i-1] + A[i-2]就好了。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100010 struct BCJ{
int fa[N];
void init(int n) {
for (int i = ; i <= n; i++) fa[i] = i;
}
void unin(int u, int v) {
fa[find(v)] = find(u);
}
int find(int u) {
return fa[u] == u? fa[u] : fa[u] = find(fa[u]);
}
}comFa;
struct faEdge{
int fa;
int c;
}fa[N];
int dep[N]; struct Graph{
struct Edge{
int to, next, c;
}e[N<<];
int head[N];
int p;
void init(){
memset(head, -, sizeof(head));
p = ;
}
void add(int u, int v, int len) {
e[p].to = v;
e[p].c = len;
e[p].next = head[u];
head[u] = p++;
}
}g, q; struct Query{
int s,t,com;
}que[N]; void dfs(int now) {
//printf("now = %d\n", now);
for (int i = g.head[now]; ~i; i = g.e[i].next) {
int &to = g.e[i].to;
//printf("to = %d\n", to);
if (dep[to] == -) {
dep[to] = dep[now]+;
fa[to].fa = now;
fa[to].c = g.e[i].c;
dfs(to);
comFa.unin(now,to);
}
}
for (int i = q.head[now]; ~i; i = q.e[i].next) {
int &to = q.e[i].to;
if (dep[to] != -) {
que[q.e[i].c].com = comFa.find(to);
}
}
} int a[N]; int main() {
int n;
while (scanf("%d", &n) != EOF) {
g.init();
for (int i = ; i < n-; i++) {
int a, b, len;
scanf("%d%d%d", &a, &b, &len);
g.add(a,b,len);
g.add(b,a,len);
} int m;
scanf("%d", &m);
q.init();
for (int i = ; i < m; i++) {
int s, t;
scanf("%d%d", &s, &t);
que[i].s = s;
que[i].t = t;
q.add(s,t,i);
q.add(t,s,i);
}
memset(dep, -, sizeof(dep));
dep[] = ;
fa[].fa = ;
fa[].c = ;
comFa.init(n);
dfs();
for (int i = ; i < m; i++) {
int nodeNum = dep[que[i].s] + dep[que[i].t] - *dep[que[i].com];
if (nodeNum >= ) {
puts("Yes");
} else {
int top = ;
for (int j = que[i].s; j != que[i].com; j = fa[j].fa) {
a[top++] = fa[j].c;
}
for (int j = que[i].t; j != que[i].com; j = fa[j].fa) {
a[top++] = fa[j].c;
}
sort(a,a+top);
bool ok = false;
for (int i = ; i < top; i++) {
if (a[i] < a[i-]+a[i-]) {
ok = true;
break;
}
}
puts(ok?"Yes":"No");
}
}
}
return ;
}

HRBUST 2064:萌萌哒十五酱的宠物~(最近公共祖先LCA)的更多相关文章

  1. HRBUST 2072:萌萌哒十五酱的礼物~(树,字典树)

    题意:n个点的一棵树,树的边上有权值.一条路径的权值定义成这条路径上所有边的权值的xor.问所有路径的最大权值是多少. 思路: 首先,树上任意两点之间的路可以表示成 这两点到根节点的路- 其最近公共祖 ...

  2. HRBUST - 2069-萌萌哒十五酱的衣服~-multiset-lower_bound

    众所周知,十五酱有很多的衣服,而且十五酱东西收拾的非常糟糕. 所以十五酱经常找不到合适的衣服穿,于是她觉得收拾一下屋子,把衣服配成一套一套的~(即一件衬衫一件裤子. 十五酱一共有n件衣服,有衬衫有裤子 ...

  3. 我的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  4. Bootstrap <基础二十五>警告(Alerts)

    警告(Alerts)以及 Bootstrap 所提供的用于警告的 class.警告(Alerts)向用户提供了一种定义消息样式的方式.它们为典型的用户操作提供了上下文信息反馈. 您可以为警告框添加一个 ...

  5. Bootstrap<基础十五> 输入框组

    Bootstrap 支持的另一个特性,输入框组.输入框组扩展自 表单控件.使用输入框组,可以很容易地向基于文本的输入框添加作为前缀和后缀的文本或按钮. 通过向输入域添加前缀和后缀的内容,您可以向用户输 ...

  6. 解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)

    解剖SQLSERVER 第十五篇  SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-sourc ...

  7. Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密

    前不久,微信的企业号使用了强制的消息加密方式,随后公众号也加入了可选的消息加密选项.目前企业号和公众号的加密方式是一致的(格式会有少许差别). 加密设置 进入公众号后台的“开发者中心”,我们可以看到U ...

  8. 十五个常用的jquery代码段【转】

    好的文章顶一个 回到顶部按钮 通过使用 jQuery 中的 animate 和 scrollTop 方法,你无需插件便可创建一个简单地回到顶部动画: 1 // Back to top 2 $('a.t ...

  9. 十五个常用的jquery代码段

    十五个常用的jquery代码段 回到顶部按钮 通过使用 jQuery 中的 animate 和 scrollTop 方法,你无需插件便可创建一个简单地回到顶部动画: 1 // Back to top ...

随机推荐

  1. 201621123080《java程序设计》第14周实验总结

    201621123080<java程序设计>第14周实验总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2. ...

  2. LeetCode之螺旋矩阵

    问题 螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ ...

  3. shell-code-拷贝文件

    #!/bin/bash while read F do cp ${F}"_pe_1.fastq.gz" /public/home/chenjy/usr/ZD/data/cleand ...

  4. UVALive - 3942 (DP + Trie树)

    给出一个长度不超过300000的字符串 S,然后给出 n 个长度不超过100的字符串. 如果字符串可以多次使用,用这 n 个字符串组成 S 的方法数是多少? 比如样例中,abcd = a + b + ...

  5. SPOJ COT2 Count on a tree II 树上莫队算法

    题意: 给出一棵\(n(n \leq 4 \times 10^4)\)个节点的树,每个节点上有个权值,和\(m(m \leq 10^5)\)个询问. 每次询问路径\(u \to v\)上有多少个权值不 ...

  6. jquery如何获取某一个兄弟节点

    $('#id').siblings() 当前元素所有的兄弟节点 $('#id').prev() 当前元素前一个兄弟节点 $('#id').prevaAll() 当前元素之前所有的兄弟节点 $('#id ...

  7. canvas 动画库 CreateJs 之 EaselJS(上篇)

    本文来自网易云社区 作者:田亚楠 须知 本文主要是根据 createjs 中的 EaselJS 在 github 上的 tutorials 目录下的文章整理而来 (原文链接),同时也包含了很多本人的理 ...

  8. Selenium WebDriver-操作键盘事件

    # 注意: !!!操作操作系统的按键,需要先装pywin32,然后通过交互模式import win32api和import win32con判断是否安装成功,需要重启下cmd进入交互模式# 下载链接: ...

  9. 大数据学习——spark-steaming学习

    官网http://spark.apache.org/docs/latest/streaming-programming-guide.html 1.1.  用Spark Streaming实现实时Wor ...

  10. datatable 修改点击列头进行排序顺序

    一般点击排序时,是先升序后降序 可以通过如下代码修改排序规则 jQuery(function ($) { $(".datatable").dataTable({ "pag ...