题意:一个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. Java的WatchService文件夹监听遇到的一些问题

    打开word文档时会新增一个~$开头的同名文件,关闭时该文件自动删除 修改excel文件时,会新增一个文件名像E56B4610,CBC15610等这样的文件,同时也会产生tmp格式的文件 PPT文件修 ...

  2. Python 建模步骤

    #%% #载入数据 .查看相关信息 import pandas as pd import numpy as np from sklearn.preprocessing import LabelEnco ...

  3. python基本操作(四)

    与用户交互 为什么交互? 计算机取代人类,解放劳动力 如何交互 print('-'*100) input('请输入你的姓名:') print(""100) Python2和Pyth ...

  4. ubuntu gcc的下载链接,比较快的。

    http://mirrors.163.com/ubuntu-releases/ http://xhmikosr.1f0.de/tools/msys/

  5. 稀疏表(ST / Sparse Table)

    RMQ问题: 给定一个序列,每次询问一个区间最小值 / 最大值. 没有修改. //拿区间最大值来举例. memset(ans, -INF, sizeof(ans)); for (int i = 1; ...

  6. Fiddler证书安装不成功

    Fiddler 抓包https配置 提示creation of the root certificate was not successful 证书安装不成功 原文链接 在使用Fiddler抓包时,我 ...

  7. Python虚拟机之if控制流(一)

    Python虚拟机中的if控制流 在所有的编程语言中,if控制流是最简单也是最常用的控制流语句.下面,我们来分析一下在Python虚拟机中对if控制流的实现 # cat demo.py a = 1 i ...

  8. Java + golang 爬取B站up主粉丝数

    自从学习了爬虫,就想在B站爬取点什么数据,最近看到一些个up主涨粉很快,于是对up主的粉丝数量产生了好奇,所以就有了标题~ 首先,我天真的以为通过up主个人空间的地址就能爬到 https://spac ...

  9. vim 查找替换命令

    http://vim.wikia.com/wiki/Search_and_replace

  10. shell批量修改文件名

    [root@localhost file1]# ls a.htm b.htm c.htm d.htm pl.sh [root@localhost file1]# vi pl.sh #!/bin/bas ...