题意:一个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. 【dp】P1982 小朋友的数字

    有趣的细节题目 题目描述 有 n 个小朋友排成一列.每个小朋友手上都有一个数字,这个数字可正可负.规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之 ...

  2. C++输入密码不显示明文

    之前有遇到需求说输入密码不显示明文,但同时会有一些其他问题,暂时没做,如今经过尝试可以实现,但是得先知道要输入的是密码.主要利用的getch()函数的不回显特点.需要注意的是这个函数不是标准函数,而且 ...

  3. LeetCode之Weekly Contest 92

    第一题:转置矩阵 问题: 给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引. 示例 1: 输入:[[1,2,3],[4,5,6],[7,8,9] ...

  4. CSS基础:block,inline和inline-block

    css的display属性是前端开发中非常常见的属性,本文简单介绍下其中比较常用的属性值,即block.inline和inline-block. HTML组件中呈现一片空白区域的组件都可当盒模型(bo ...

  5. Hogan的安装和使用

    Hogan的安装和使用 通过npm安装hogan: npm install hogan.js --save-dev CommonJs下的使用方式: // 引入hogan var hogan = req ...

  6. 小试nginx日志分析xlog

    nginx配置: http { #...其他配置 log_format tpynormal '$remote_addr | [$time_local] | $host | "$request ...

  7. python向上取整 向下取整

    向上取整 ceil() 函数返回数字的向上取整整数,就是返回大于等于变量的最近的整数. ceil()是不能直接访问的,需要导入 math 模块. import math math.ceil( x ) ...

  8. 全网最详细python中socket套接字send与sendall的区别

    将数据发送到套接字. 套接字必须连接到远程套接字.  返回发送的字节数. 应用程序负责检查是否已发送所有数据; 如果仅传输了一些数据, 则应用程序需要尝试传递剩余数据.(需要用户自己完成) 将数据发送 ...

  9. 启动activity的标准的action常量及对应的字符串

  10. jmeter进行dubbo接口测试

    最近工作中接到一个需求,需要对一个MQ消息队列进行性能测试,测试其消费能力,开发提供了一个dubbo服务来供我调用发送消息. 这篇博客,介绍下如何利用jmeter来测试dubbo接口,并进行性能测试. ...