G. Robots
time limit per test

5.0 s

memory limit per test

256 MB

input

standard input

output

standard output

The Robotics Olympiad teams were competing in a contest.

There was a tree drawn on the floor, consisting of n nodes and n - 1 edges. The nodes are numbered from 1 to n, and each edge has a weight. The tree is rooted at the first node. q teams are participating, and each team is given an integer xi. Their robot should start at node 1, and move in the following way until there are no valid moves left: From all the edges between the current node and it's children, go through the edge with the maximum value less than xi. Note that the robot can't move to the parent, only to children.

However, the teams weren't able to program the robots to return to them after the contest, so they had to manually pick them up. Since the tree can be quite large, they need your help to determine where each robot ended it's movement.

Input

The first line contains a single integer T, the number of test cases.

The first line of each test case contains two space-separated integers n and q. (1 ≤ n, q ≤ 105).

The following n - 1 lines contain 3 integers ui, vi, wi. This means that there is an edge connecting nodes ui and vi, with weight wi. (1 ≤ ui, vi ≤ n) (1 ≤ wi ≤ 109). It's guaranteed that all wi are distinct.

The following line contains q integers xi. (1 ≤ xi ≤ 109).

Output

For each test case, print one line with a single number Si, the sum of numbers of nodes where each robot ends.

Example
input

Copy
1
5 7
1 2 3
1 3 4
3 4 9
3 5 7
1 3 4 9 8 7 10
output

Copy
21
Note

In the sample test case, the robots end in the following nodes: {1, 1, 2, 5, 5, 3, 4}.

Si = 1+1+2+5+5+3+4 = 21.

Large I/O files. Please consider using fast input/output methods.

【题意】

有n个点,n-1条边,每条边有权值。现在有M个机器人,他们也有自己的权值,他们会从点1开始顺着这颗树向下走,每个机器人能走的边是那些边的权值严格小于机器人权值的边。但是机器人是有选择的,它只会走那些能选择的边里面权值尽可能大的边走,并且它们是无法回头的。

现在询问给定的M个机器人最后停留在哪些点,求这些点的和


【分析】

把每个点连出去的边按照权值降序排序,这样保证在之后的遍历中优先选择边权大的(贪心)。每个机器人的最后停留位置是固定的,所以他们谁先走的顺序是无所谓的,只有权值才是我们需要的。所以按照机器人的权值从大到小也排序一遍,这里用优先队列来更新这个信息。

首先预处理出达到每个点所需要的最大的权值大小用mx[ ]记录。再按照DFS的顺序到达每个无法再向下的点的时候比较该点的mx[ i
]值与当前权值最大的机器人的权值,若机器人的权值大于mx[ i
]则表示这个机器人是可以到达这里的,此时更新答案并且把这个机器人从队列中取出。这样操作直到队头元素不满足权值大于mx[ i
],然后开始回溯,这样就可以保证每个机器人一定是达到了他们固定的位置。
 


【代码】

#include<queue>
#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+5;
struct E{
int u,v,w;
E(int _u=0,int _v=0,int _w=0){u=_u;v=_v;w=_w;}
inline bool operator <(const E &a)const{
return w>a.w;
}
};
vector<E>e[N];
priority_queue<int>q;
int n,m,cas,mx[N];long long ans;
void dfs(int x,int fa){
int sz=e[x].size();
for(int i=0;i<sz;i++){
int v=e[x][i].v;
if(v!=fa){
mx[v]=max(mx[x],e[x][i].w);
dfs(v,x);
}
}
}
void DFS(int x,int fa){
if(q.empty()||q.top()<=mx[x]) return ;
int sz=e[x].size();
for(int i=0;i<sz;i++){
int v=e[x][i].v;
if(v!=fa&&q.top()>mx[v]&&!q.empty()){
DFS(v,x);
}
}
for(;q.top()>mx[x]&&!q.empty();q.pop()) ans+=x;
}
inline void Clear(){
ans=0;
for(;!q.empty();q.pop());
for(int i=1;i<=n;i++) e[i].clear(),mx[i]=0;
}
inline void Init(){
scanf("%d%d",&n,&m);
for(int i=1,x,y,z;i<n;i++) scanf("%d%d%d",&x,&y,&z),e[x].push_back(E(x,y,z)),e[y].push_back(E(y,x,z));
for(int i=1,x;i<=m;i++) scanf("%d",&x),q.push(x);
for(int i=1;i<=n;i++) sort(e[i].begin(),e[i].end());
}
inline void Solve(){
dfs(1,0);
DFS(1,0);
printf("%I64d\n",ans);
}
int main(){
for(scanf("%d",&cas);cas--;Clear()){
Init();
Solve();
}
return 0;
}

 

Gym 101915G Robots的更多相关文章

  1. Robots Gym - 101915G

    传送门 The Robotics Olympiad teams were competing in a contest. There was a tree drawn on the floor, co ...

  2. Gym 101915

    Gym - 101915A  Printing Books 题意:有一本书,从第X页开始,一共用了n位数字,求此书一共多少页.99就是两位数字,100就是三位数字. 思路:直接模拟即可,我用了一个hi ...

  3. 要back的题目 先立一个flag

    要back的题目 目标是全绿!back一题删一题! acmm7 1003 1004 acmm8 1003 1004 sysu20181013 Stat Origin Title Solved A Gy ...

  4. gym 100971 J Robots at Warehouse

    Vitaly works at the warehouse. The warehouse can be represented as a grid of n × m cells, each of wh ...

  5. 【Gym 100971J】Robots at Warehouse

    题意 链接给你一个n*m的地图,'#'代表墙,‘.’代表可走的,1代表1号机器人,2代表2号机器人,机器人可以上下左右移动到非墙的位置,但不能走到另一个机器人身上.问能否交换1和2的位置. 分析 如果 ...

  6. Codeforces Gym 100610 Problem K. Kitchen Robot 状压DP

    Problem K. Kitchen Robot Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10061 ...

  7. Gym 100971J-Robots at Warehouse

    题目链接:http://codeforces.com/gym/100971/problem/J Vitaly works at the warehouse. The warehouse can be ...

  8. Gym - 100971J (思维+简单bfs)

    题目链接:http://codeforces.com/gym/100971/problem/J J. Robots at Warehouse time limit per test 2.0 s mem ...

  9. (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest

    layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest author: "luow ...

随机推荐

  1. JavaScript 编码小技巧

    三元操作符 如果使用if...else语句,那么这是一个很好节省代码的方式. Longhand: const x = 20; let answer; if (x > 10) { answer = ...

  2. Business vs Technology

    Business 只是 Technology的子集. Business只是体现在Code中. 比如说是HTML页面中内容的一部分. 或者说业务是对HTML组成的内容的分类. 比如说Smallbusin ...

  3. ScrollView子控件高度设置无效

    ScrollView子控件高度设置无效 简述 项目中引入了第三方的下拉刷新包PullToRefreshScrollView. 由于我之前布局未考虑下拉刷新功能.后来暂时发现添加上去,发现.子控件的高度 ...

  4. Js参数值中含有单引号或双引号解决办法

    <script type="text/javascript"> function Display(LoginEmail, UserName, ID) {         ...

  5. 通过NAT转发实现私网对外发布信息

    我们可以在防火墙的外部网卡上绑定多个合法IP地址,然后通过ip映射使发给其中某一个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包. 具体的IP ...

  6. 【ML】人脸识别

    https://github.com/colipso/face_recognition https://medium.com/@ageitgey/machine-learning-is-fun-par ...

  7. Android学习之——切换应用主题实现日间和夜间效果的更换

    前言 智能手机的迅速普及,大大的丰富了我们的娱乐生活.现在大家都喜欢晚上睡觉前玩会儿手机,但是应用的日间模式往往亮度太大,对眼睛有较为严重的伤害. 因此,如今的应用往往开发了日间和夜间两种模式供用户切 ...

  8. mysql初始化时报错bin/mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory的处理

    问题描述: 今天新安装了一个linux虚拟机,然后安装mysql 5.7.21,在进行初始化的时候,报错 bin/mysqld: error : cannot open shared object f ...

  9. python类和模块区别,python命名空间

    在python中,类可以提供模块级别之下的命名空间. 如果一个模块写很多函数,某些函数之间共同完成一组功能,用类会看起来更清晰,在调用时候也会更好,对于ide补全有更小范围的限定提示. 类提供 继承 ...

  10. 【笔试面试】神马搜索C++程序猿电话面试

    面试时间:2015.07.15 预约时间:2015.07.14.电话面试前一天,会电话咨询你方面电话面试的时间. 面试环节: 无自我介绍(这是我面试这么多家公司碰到的第一次),直接面试内容. 问题1: ...