vijos p1460——拉力赛
描述
车展结束后,游乐园决定举办一次盛大的山道拉力赛,平平和韵韵自然也要来参加大赛。
赛场上共有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。
LCA,只用记录下deep就可以了,LCA判断x和y的公共祖先是否为x或y若是的话加上时间即可。
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 const int maxn=10005; 7 int fa[maxn][20],deep[maxn]; 8 int head[maxn],nextn[maxn],tov[maxn],w[maxn]; 9 int pd[maxn]; 10 int n,m,tot;int d[maxn]; 11 long long t,ans; 12 void go(int x,int y,int z) 13 { 14 tot++; 15 nextn[tot]=head[x]; 16 head[x]=tot; 17 tov[tot]=y; 18 w[tot]=z; 19 } 20 21 void dfs(int x) 22 { 23 int v=head[x]; 24 while(v) 25 { 26 if(pd[tov[v]]==false) 27 { 28 fa[tov[v]][0]=x; 29 deep[tov[v]]=deep[x]+1; 30 d[tov[v]]=d[x]+w[v]; 31 pd[tov[v]]=true; 32 int ii=0,pos=x; 33 while(fa[pos][ii]) 34 { 35 fa[tov[v]][ii+1]=fa[pos][ii]; 36 pos=fa[pos][ii]; 37 ii++; 38 } 39 dfs(tov[v]); 40 } 41 v=nextn[v]; 42 } 43 } 44 void lca(int x,int y) 45 { 46 if(deep[x]>deep[y])return ; 47 int m=deep[y]-deep[x]; 48 int ii=0; 49 int k=y; 50 while(m) 51 { 52 if(m&1)y=fa[y][ii]; 53 m=(m>>1); 54 ii++; 55 } 56 if(x!=y)return ; 57 ans++; 58 t+=d[k]-d[x]; 59 } 60 int main() 61 { 62 scanf("%d%d",&n,&m); 63 for(int i=1;i<=n-1;i++) 64 { 65 int x,y,z; 66 scanf("%d%d%d",&x,&y,&z); 67 go(x,y,z); 68 } 69 deep[1]=1;pd[1]=true; 70 dfs(1); 71 for(int i=1;i<=m;i++) 72 { 73 int x,y; 74 scanf("%d%d",&x,&y); 75 lca(x,y); 76 } 77 printf("%I64d\n",ans); 78 printf("%I64d\n",t); 79 return 0; 80 }
转载于:https://www.cnblogs.com/937337156Zhang/p/6052410.html
vijos p1460——拉力赛相关推荐
- vijos 1006 晴天小猪历险记之Hill——数字三角形的终极变化
题目链接:https://vijos.org/p/1006 数字三角形原题看这里:http://www.cnblogs.com/huashanqingzhu/p/7326837.html 背景 在很久 ...
- vijos 1476 旅游规划题解
题目链接:https://vijos.org/p/1476 解:因为这一定是一棵树,所以我们多画几次图,就会发现所有的最长路径中心点都一样,且中心点把这条最长路径分成两段等长的路. 那么做法就很简单啦 ...
- Vijos P1848 记数问题【进制】
描述 试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9)共出现了多少次?例如,在 1 到 11 中,即在 1.2.3.4.5.6.7.8.9.10.11 中,数字 1 出现了 4 ...
- Vijos P1131 最小公倍数和最大公约数问题【暴力】
最小公倍数和最大公约数问题 描述 输入二个正整数x0,y0(2≤x0≤100000,2≤y0≤1000000),求出满足下列条件的P.Q的个数. 条件:1.P.Q是正整数 2.要求P.Q以xO为最大公 ...
- Vijos P1103 校门外的树【线段树,模拟】
校门外的树 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,--, ...
- 拉力赛 (Standard IO)
题意/Description: 车展结束后,游乐园决定举办一次盛大的山道拉力赛,平平和韵韵自然也要来参加大赛. 赛场上共有n个连通的计时点,n-1条赛道(构成了一棵树).每个计时点的高度都不相同(父结 ...
- Vijos p1165 火烧赤壁 离散化+单调栈
题目链接:https://vijos.org/p/1165 题意:输入n(n <= 20,000)段线段的端点,问所有线段的长度总和为多少? input: 3 -1 1 5 11 2 9 out ...
- |Vijos|树状数组|P1512 SuperBrother打鼹鼠
https://vijos.org/p/1512 一个二维树状数组,注意树状数组不能出现0,把所有坐标+1即可,求子矩阵和为 sub(x2,y2) - sub(x1-1,y2) - sub(x2, y ...
- Vijos P1756 数字反转【进制】
背景 noip2011 NO.1 描述 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2). ...
最新文章
- SWIFT问题很大,第4家受害银行浮出水面
- 安卓 静态文件读取 staticFile
- Vue.js组件化开发实践
- 两周的时间教会我,要低头做人(jQuery实现京东购物车)
- Java并发编程(一)线程的各种创建方式
- C#.Net工作笔记013---c# lambda表达式对list数据进行条件查询_分组_排序_过滤_很好用
- Python学习之路(一)字符串
- matlab对数组中的某一列进行排序
- 无线桥接与中继的区别
- 2021年石景山区景贤计划人才认定条件及材料,补贴100万
- 前端学习——静态网页制作
- Scroller全认知,对于Scroller 你真的了解吗?
- 博凌科技携手中企动力用互联网思维卖乐器
- 如何撰写国内外研究现状
- MySQL CAST()函数用法
- Zephyr pinctrl
- UVA-12627(考眼力~)
- 看Lucene源码必须知道的基本概念
- 3.5寸服务器硬盘v4,【02311REJ 960GB SSD SATA RH2288V3 V4华为服务器硬盘】价格_厂家 - 中国供应商...
- QG工作室——智能与嵌入式系统小组