题意:一个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. 05tar命令详解

    tar 命令用于对文件进行打包压缩或解压,格式为"tar [选项][文件]". ​ 在Linux 系统中,常见的文件格式比较多,其中主要使用的是 .tar 或者 .tar.gz 或 ...

  2. H5(一)H5与HTML、XHTML的不同

    一.基本概念 html:超文本标记语言 (Hyper Text Markup Language) xhtml:可扩展超文本标记语言,是一种置标语言,表现方式与超文本标记语言(HTML)类似,不过语法上 ...

  3. linux文件属性描述(inode,block)

    1.ls   -lhi 文字解释: 第一列:inode索引节点编号(人的身份证,全国唯一) 系统读取文件时首先通过文件名找到inode,然后才能读取到文件内容. 第二列:文件类型及权限(共10个字符, ...

  4. java的重载(overload) (2013-10-11-163 写的日志迁移

    有以下几点: 1.方法名相同. 2.方法的 参数类型.个数.顺序至少有一项不同. 3.方法的返回类型可以不同. 4.方法的修饰符可以不同. 5.仅返回类型和修饰符不同也不可以构成重载.   ----- ...

  5. Shuffle UVA - 12174 尺取法

    题目:题目链接 思路:见紫书,对具体操作方式还不是很理解,代码是从一个题解里看的,以后多回顾下,需要理解 代码: #include <iostream> #include <cstr ...

  6. The 2018 ACM-ICPC China JiangSu Provincial Programming Contest J. Set

    Let's consider some math problems. JSZKC has a set A=A={1,2,...,N}. He defines a subset of A as 'Meo ...

  7. Android后台的linux一直保持唤醒状态,不进入睡眠

    由于要做Android手机的电池续航测试,是不能插usb的,所以把case放到sh文件中,之后push到手机里,执行的. 但是出现个问题,假如case中有很长时间的sleep操作,关闭手机屏幕,这样l ...

  8. Android兼容性测试CTS --环境搭建、测试执行、结果分析

    为了确保Android应用能够在所有兼容Android的设备上正确运行,并且保持相似的用户体验,在每个版本发布之时,Android提供了一套兼容性测试用例集合(Compatibility Test S ...

  9. 1036: [ZJOI2008]树的统计Count(树链剖分)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 19830  Solved: 8067[Submit ...

  10. EXCEL宏做数据拆分

    用处:将大容量的EXCEL工作簿分解成若干个小的工作簿 Sub aa() For i = 1 To 8 Set nb = Workbooks.Add nb.SaveAs Filename:=ThisW ...