Vijos——T1406 拉力赛
https://vijos.org/p/1460
描述
车展结束后,游乐园决定举办一次盛大的山道拉力赛,平平和韵韵自然也要来参加大赛。
赛场上共有n个连通的计时点,n-1条赛道(构成了一棵树)。每个计时点的高度都不相同(父结点的高度必然大于子结点),相邻计时点间由赛道相连。由于马力不够,所以韵韵的遥控车只能从高处驶向低处。而且韵韵的车跑完每条赛道都需花费一定的时间。
举办方共拟举办m个赛段的比赛,每次从第u个计时点到第v个计时点,当然其中有不少比赛韵韵的遥控车是不能参加的(因为要上坡)。平平想知道他能参加多少个赛段的比赛,并且想知道他完成这些赛段的总用时。
赛道皆为单向。
格式
输入格式
第一行两个整数n,m。
接下来n-1行每行3个整数a、b、t。
表示韵韵的遥控车可以花t秒从第a个计时点到第b个计时点。
接下来m行每行2个整数u、v,意义如描述所示。
输出格式
第一行输出一个正整数,表示能参加的赛段数。
第二行输出一个正整数,表示总用时。
样例1
样例输入1
6 2
1 2 1
2 4 1
2 5 1
5 6 1
1 3 1
2 6
4 5
样例输出1
1
2
限制
各个测试点1s
提示
第一个计时点的高度是最高的;
u≠v;
对于50%的数据 n≤1000 m≤1000;
对于100%的数据 n≤10000 m≤100000;
答案小于2^64。
来源
f1zsy birdor
按标签就开始码,结果~LCA 60~
#include <algorithm>
#include <iostream>
#include <cstdio> using namespace std; #define LL long long const int N(+);
LL n,m,u,v,w; LL head[N],sumedge;
struct Edge
{
LL u,v,w,next;
Edge(LL u=,LL v=,LL next=,LL w=):
u(u),v(v),next(next),w(w){}
}edge[N];
void ins(LL u,LL v,LL w)
{
edge[++sumedge]=Edge(u,v,head[u],w);
head[u]=sumedge;
} LL dis[N],size[N],deep[N],dad[N],top[N];
void DFS(LL x)
{
size[x]=; deep[x]=deep[dad[x]]+;
for(int i=head[x];i;i=edge[i].next)
{
LL v=edge[i].v;
if(dad[x]!=v)
{
dad[v]=x;
dis[v]=dis[x]+edge[i].w,
DFS(v),size[x]+=size[v];
}
}
} void DFS_(LL x)
{
LL t=; if(!top[x]) top[x]=x;
for(int i=head[x];i;i=edge[i].next)
{
LL v=edge[i].v;
if(dad[x]!=v&&size[t]<size[v]) t=v;
}
if(t) top[t]=top[x],DFS_(t);
for(int i=head[x];i;i=edge[i].next)
{
LL v=edge[i].v;
if(dad[x]!=v&&t!=v) DFS_(v);
}
} LL LCA(LL x,LL y)
{
for(;top[x]!=top[y];x=top[dad[x]])
if(deep[top[x]]<deep[top[y]]) swap(x,y);
return deep[x]<deep[y]?x:y;
} LL ansnum,anstim; int main()
{
cin>>n>>m;
for(int i=;i<n;i++)
cin>>u>>v>>w,ins(u,v,w),ins(v,u,w);
DFS();DFS_();
for(;m;m--)
{
cin>>u>>v;
if(u==LCA(u,v))
ansnum++,anstim+=dis[v]-dis[u];
}
cout<<ansnum<<endl<<anstim;
return ;
}
AWWAWAAAWA
然后看题解,用sta记录点的先序遍历,ove记录后序遍历,
如果sta[u]<sta[v]&&ove[u]>ove[v]就说明u是v的祖先~
#include <iostream>
#include <cstdio> using namespace std; const int M(+);
int n,m,u,v,ansnum;
long long w,anstim; int head[M],sumedge;
struct Edge
{
int u,v,next,dis;
long long w;
Edge(int u=,int v=,int next=,int dis=):
u(u),v(v),next(next),dis(dis){}
}edge[M];
void ins(int u,int v,int w)
{
edge[++sumedge]=Edge(u,v,head[u],w);
head[u]=sumedge;
} int dis[M],sta[M],ove[M],tim;
void DFS(int now,int val)
{
sta[now]=++tim; dis[now]=val;
for(int i=head[now];i;i=edge[i].next)
DFS(edge[i].v,val+edge[i].dis);
ove[now]=++tim;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
scanf("%d%d%I64d",&u,&v,&w),ins(u,v,w);
DFS(,);
for(;m;m--)
{
scanf("%d%d",&u,&v);
if(sta[u]<sta[v]&&ove[u]>ove[v])
ansnum++,anstim+=dis[v]-dis[u];
}
cout<<ansnum<<endl<<anstim;
return ;
}
Vijos——T1406 拉力赛的更多相关文章
- 【BZOJ 1061】【Vijos 1825】【NOI 2008】志愿者招募
http://www.lydsy.com/JudgeOnline/problem.php?id=1061 https://vijos.org/p/1825 直接上姜爷论文... #include< ...
- vijos P1915 解方程 加强版
背景 B酱为NOIP 2014出了一道有趣的题目, 可是在NOIP现场, B酱发现数据规模给错了, 他很伤心, 哭得很可怜..... 为了安慰可怜的B酱, vijos刻意挂出来了真实的题目! 描述 已 ...
- vijos P1780 【NOIP2012】 开车旅行
描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...
- 【BZOJ 2541】【Vijos 1366】【CTSC 2000】冰原探险
http://www.lydsy.com/JudgeOnline/problem.php?id=2541 https://vijos.org/p/1366 loli秘制大爆搜_(:з」∠)_坑了好久啊 ...
- 【BZOJ 1065】【Vijos 1826】【NOI 2008】奥运物流
http://www.lydsy.com/JudgeOnline/problem.php?id=1065 https://vijos.org/p/1826 好难的题啊TWT ∈我这辈子也想不出来系列~ ...
- [题解]vijos & codevs 能量项链
a { text-decoration: none; font-family: "comic sans ms" } .math { color: gray; font-family ...
- [题解]vijos 运输计划
Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P 掌管一家 ...
- vijos P1448 校门外的树
描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的--如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:\(K=1\),读入\(l, ...
- [vijos P1083] 小白逛公园
不知怎地竟有种错觉此题最近做过= =目测是类似的?那道题貌似是纯动归? 本来今晚想做两道题的,一道是本题,一道是P1653疯狂的方格取数或NOI08 Employee,看看现在的时间目测这个目标又达不 ...
随机推荐
- oracle 11g RAC手动卸载grid,no deinstall
1.通过root用户进入到grid的ORACLE_HOME [root@db01]# source /home/grid/.bash_profile [root@db01]# cd $ORACLE_H ...
- ps学习入门篇
http://www.360doc.com/content/12/0107/21/6932394_177976138.shtml 填充前景色 前景色是ALT+DELETE,背景色是CTRL+DELET ...
- Android jni 二维数组 传递
学习Android Jni时,一个二维 整数 数组的传递花了我好长时间,在网上查的资料都不全,当然最后是成功了,写在这里是为了自己记住,当然有人搜索到并利用了我会很高兴. in Android J ...
- 构造函数的理解(构造函数与 init 方法)
0. 构造函数与 init 方法 构造方法内部禁止添加任何业务逻辑,如果有业务逻辑,请放在 init 方法中: 1. 构造函数的参数 以下为一个堆实现优先队列(堆的实现借助完全二叉树,而完全二叉树又可 ...
- C++笔试专题一:运算符重载
一:下面重载乘法运算符的函数原型声明中正确的是:(网易2016校招) A:MyClass operator *(double ,MyClass); B:MyClass operator *(MyCla ...
- gcd步数
题目描述 一个有趣的函数F(a,b),表示对于数对(a,b)调用辗转相除法的步数为多少 例如 (24,40)....0 (16,24).....1 (8,16).....2 (0,8)....3,即f ...
- const 和 pointer
一般的: const对pointer的修饰有两种: const type * p/type const * p:表示指针指向的变量的值不能改变,无论指针改变为指向哪一个变量 type * const ...
- 监控mysqld服务
#!/bin/bash #监控mysqld服务 #telnet 192.168.122.171 3306 | grep Connected | wc -l #远程检查 #num=`netstat -n ...
- POJ 2241 The Tower of Babylon
The Tower of Babylon Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Or ...
- DATA_PUMP_DIR impdp 指定导出目录
1.mkdir /tdms1/oracle/dump 2.sqlplus / as sysdba 3.create directory udir as '/tdms1/oracle/dump'; 4. ...