广工2017校赛-F-- tmk找三角
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]即可
其实和这道题目是一模一样的:
下面的代码为了避免每次查询时都DFS一遍,使用了LCA优化了(最朴素的LCA算法)
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100000;
int cnt = 1;
struct edge
{
int y, val;
int nxt;
};
edge tree[MAXN * 3];
int head[MAXN];
void addedge(int a, int b, int val)
{
tree[cnt].y = b, tree[cnt].val = val;
tree[cnt].nxt = head[a];
head[a] = cnt++;
}
int dpt[MAXN], fa[MAXN],len[MAXN];
void dfs(int id)
{
dpt[id] = dpt[fa[id]] + 1;
int tmp = head[id];
for (; tmp; tmp = tree[tmp].nxt) {
if (tree[tmp].y != fa[id]) {
fa[tree[tmp].y]=id;
dfs(tree[tmp].y);
}
else{
len[id]=tree[tmp].val;
}
}
return ;
}
int e[MAXN];
int top;
bool check(int a, int b)
{
top = 0;
if (dpt[a] < dpt[b]) swap(a, b);
while (dpt[a] > dpt[b]) {
e[++top]=len[a];
if(top>=50) return false;
a=fa[a];
}
while(a!=b){
e[++top]=len[a];
e[++top]=len[b];
if(top>=50) return false;
a=fa[a];
b=fa[b];
}
sort(e+1,e+top+1);
for(int i=1;i<=top-2;i++){
if(e[i]+e[i+1]>e[i+2]) return true;
}
return false;
}
void init()
{
cnt=1;
memset(dpt,0,sizeof(dpt));
memset(head,0,sizeof(head));
memset(fa,0,sizeof(fa));
len[1]=0;
fa[1]=0;
}
int main()
{
//freopen("data.in","r",stdin);
int t;
int n, a, b, le;
scanf("%d", &t);
while (t--) {
init();
scanf("%d", &n);
for (int i = 0; i < n-1; i++) {
scanf("%d%d%d", &a, &b, &le);
addedge(a, b, le);
addedge(b, a, le);
}
dfs(1);
int m;
scanf("%d", &m);
for (int i = 0; i < m; i++) {
scanf("%d%d", &a, &b);
if (check(a, b))
printf("Yes\n");
else
printf("No\n");
}
}
}
广工2017校赛-F-- tmk找三角的更多相关文章
- 2017校赛 问题 F: 懒人得多动脑
题目描述 小D的家A和学校B都恰好在以点F为焦点的双曲线上,而小D每日所需的生活水源在一条平行该双曲线准线的直线上,设它的值为v.大家都知道,每天都是要喝水的,但是小D有点懒,他希望自己能在去上学或者 ...
- 校赛F
问题描述 例如对于数列[1 2 3 4 5 6],排序后变为[6 1 5 2 4 3].换句话说,对于一个有序递增的序列a1, a2, a3, ……, an,排序后为an, a1, an-1, a2, ...
- 校赛F 比比谁更快(线段树)
http://acm.cug.edu.cn/JudgeOnline/problem.php?cid=1153&pid=5 题意:给你一个字符串,各两个操作: ch=0,[l,r]降序 ch=1 ...
- 上海高校金马五校赛 F题:1 + 2 = 3?
链接:https://www.nowcoder.com/acm/contest/91/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言26214 ...
- xdu2017校赛F
Problem F Dogs of Qwordance Senior Backend R&D Engineers 问题描述 那年夏天,锘爷和杰师傅漫步在知春公园的小道上.他们的妻子.孩子牵 着 ...
- 浙江理工2015.12校赛-F Landlocked
Landlocked Time Limit: 5 Sec Memory Limit: 128 MB Submit: 288 Solved: 39 Description Canada is not a ...
- 广州工业大学2016校赛 F 我是好人4 dfs+容斥
Problem F: 我是好人4 Description 众所周知,我是好人!所以不会出太难的题,题意很简单 给你n个数,问你1000000000(含1e9)以内有多少个正整数不是这n个数任意一个的倍 ...
- 郑轻校赛 2127 tmk射气球 (数学)
Description 有一天TMK在做一个飞艇环游世界,突然他发现有一个气球匀速沿直线飘过,tmk想起了他飞艇上有一把弓,他打算拿弓去射气球,为了提高射击的准确性,他首先在飞艇上找到一个离气球最近的 ...
- 北邮校赛 F. Gabriel's Pocket Money(树状数组)
F. Gabriel's Pocket Money 2017- BUPT Collegiate Programming Contest - sync 时间限制 2000 ms 内存限制 65536 K ...
随机推荐
- Luogu P3520 [POI2011]SMI-Garbage
题目 把要变边权的边拿出来找欧拉回路就行了.正确性显然,因为一条边经过两次相当于对欧拉回路度数的奇偶性没有影响. 然后把一个个小环输出即可,具体的我也不知道怎么输,题目没讲清楚,我按着题解的来的. # ...
- C# 面向对象6 之前的复习
复习练习 THIS:调用当前类的构造函数
- 107、如何配置 Health Check ? (Swarm14)
参考https://www.cnblogs.com/CloudMan6/p/8053323.html 容器状态是UP的,那应用就是健康的吗? 不一定 Docker 只能从容器启动进程的返 ...
- 关于redis的几件小事(四)redis的过期策略以及内存淘汰机制
1.数据为什么会过期? 首先,要明白redis是用来做数据缓存的,不是用来做数据存储的(当然也可以当数据库用),所以数据时候过期的,过期的数据就不见了,过期主要有两种情况, ①在设置缓存数据时制定了过 ...
- 用原生js来写一个swiper滑块插件
是不是有点印象了,没错,他的最基本的用法就是左右滑动,插件使用者只需要写几行简单的html和js即可实现一个简单滑动效果,不过你完全可以组合各种元素来适应不同的场景. 当然插件我已经写好了,咱 ...
- 多线程编程-- part 8 CyclicBarrier
CyclicBarrier简介 cuclicBarrier允许一组线程互相等待,直到到达某个公共屏障点(common barrier point).因为该barrier在释放等待线程后可以重用,所以称 ...
- mui在tab选项卡中echarts图表不能动态随页面变化大小 只能固定大小
在mui tab选项卡中一直都不能让echarts动态变化大小 只能固定大小来展示图表,网上说的window.onresize = mycharts.resize;方法根本就没有效果,后面在https ...
- mysql统计表中条目个数的方法举例
说明:以下标红且加大括号的均需要替换为实际待查询的表名或数据库名. [1].统计某张或某几张表的数据量: select count(*) from {TABLE_NAME}; #or select c ...
- Spring笔记之配置数据源
任何DAO访问数据库,最开始都需要配置数据源,数据源中定义了访问数据库的常用配置.有了数据源才能创建数据模板,然后把数据模板注入到DAO中,通过调用数据访问模板中的相应方法来对数据库进行相关操作. 常 ...
- ValueError:Object arrarys cannot be loaded when allow_pickle=False
运行python程序报错:ValueError:Object arrarys cannot be loaded when allow_pickle=False 错误原因:numpy版本太高 解决方案: ...