ACM-ICPC2018 青岛赛区网络预赛-B- Red Black Tree
题目描述
Let’s define the cost of a red vertex to be 0, and the cost of a black vertex to be the distance between this vertex and its nearest red ancestor.
Recall that
- The length of a path on the tree is the sum of the weights of the edges in this path.
- The distance between two vertices is the length of the shortest path on the tree to go from one vertex to the other.
- Vertex u is the ancestor of vertex v if it lies on the shortest path between vertex v and the root of the tree (which is vertex 1 in this problem).
As BaoBao is bored, he decides to play q games with the tree. For the i-th game, BaoBao will select ki vertices vi,1, vi,2, . . . , vi,ki on the tree and try to minimize the maximum cost of these ki vertices by changing at most one vertex on the tree to a red vertex.
Note that
- BaoBao is free to change any vertex among all the n vertices to a red vertex, NOT necessary among the ki vertiecs whose maximum cost he tries to minimize.
- All the q games are independent. That is to say, the tree BaoBao plays with in each game is always the initial given tree, NOT the tree modified during the last game by changing at most one vertex.
Please help BaoBao calculate the smallest possible maximum cost of the given ki vertices in each game after changing at most one vertex to a red vertex.
输入
The first line contains three integers n, m and q (2≤m≤n≤105, 1≤q≤2×105), indicating the size of the tree, the number of red vertices and the number of games.
The second line contains m integers r1, r2, . . . , rm (1 = r1 < r2 <...< rm≤n), indicating the red vertices.
The following (n-1) lines each contains three integers ui, vi and wi (1≤ui, vi≤n, 1≤wi≤109),indicating an edge with weight wi connecting vertex ui and vi in the tree.
For the following q lines, the i-th line will first contain an integer ki (1≤ki≤n). Then ki integers vi,1, vi,2, . . . , vi,ki follow (1≤vi,1 < vi,2 < ... < vi,ki≤n), indicating the vertices whose maximum cost BaoBao has to minimize.
It’s guaranteed that the sum of n in all test cases will not exceed 106, and the sum of ki in all test cases will not exceed 2×106.
输出
样例输入
2
12 2 4
1 9
1 2 1
2 3 4
3 4 3
3 5 2
2 6 2
6 7 1
6 8 2
2 9 5
9 10 2
9 11 3
1 12 10
3 3 7 8
4 4 5 7 8
4 7 8 10 11
3 4 5 12
3 2 3
1 2
1 2 1
1 3 1
1 1
2 1 2
3 1 2 3
样例输出
4
5
3
8
0
0
0
提示

The first sample test case is shown above. Let’s denote C(v) as the cost of vertex v.
For the 1st game, the best choice is to make vertex 2 red, so that C(3) = 4, C(7) = 3 and C(8) = 4. So the answer is 4.
For the 2nd game, the best choice is to make vertex 3 red, so that C(4) = 3, C(5) = 2, C(7) = 4 and C(8) = 5. So the answer is 5.
For the 3rd game, the best choice is to make vertex 6 red, so that C(7) = 1, C(8) = 2, C(10) = 2 and C(11) = 3. So the answer is 3.
For the 4th game, the best choice is to make vertex 12 red, so that C(4) = 8, C(5) = 7 and C(12) = 0.
So the answer is 8.
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=+;
int T,n,m,q,cnt,tot;
bool red[N];
int last[N],pos[N],f[N],rmq[N],mm[N],dp[N][],a[N];
ll cost[N],cost_t[N];
struct tree{
int v,w,nex;
}t[N];
bool cmp(int a,int b)
{
return cost_t[a]>cost_t[b];
}
void add(int x,int y,int z)
{
cnt++;
t[cnt].v=y;
t[cnt].nex=last[x];
last[x]=cnt;
t[cnt].w=z;
}
void dfs(int x,int fa,int deep,ll dis,ll dis1)
{
if (red[x]) dis1=;
cost[x]=dis; cost_t[x]=dis1;
pos[x]=tot; f[tot]=x; rmq[tot++]=deep;
for (int i=last[x];i;i=t[i].nex)
{
if (t[i].v==fa) continue;
dfs(t[i].v,x,deep+,dis+t[i].w,dis1+t[i].w);
f[tot]=x;
rmq[tot++]=deep;
}
}
void ST(int n)
{
mm[]=-;
for (int i=;i<=n;i++)
{
mm[i]=((i&(i-))==) ? mm[i-]+:mm[i-];
dp[i][]=i;
}
for (int j=;j<=mm[n];j++)
for (int i=;i+(<<j)-<=n;i++)
dp[i][j]=rmq[dp[i][j-]]<rmq[dp[i+(<<(j-))][j-]] ? dp[i][j-] : dp[i+(<<(j-))][j-];
}
int query(int a,int b)
{
a=pos[a]; b=pos[b];
if (a>b) swap(a,b);
int k=mm[b-a+];
int ret=rmq[dp[a][k]]<=rmq[dp[b-(<<k)+][k]] ? dp[a][k] : dp[b-(<<k)+][k];
return f[ret];
}
int main()
{
scanf("%d",&T);
while (T--)
{
int x,y,z,k;
cnt=; tot=;
memset(red,,sizeof(red));
memset(last,, sizeof(last)); scanf("%d%d%d",&n,&m,&q);
for (int i=;i<=m;i++)
{
scanf("%d",&x);
red[x]=true;
}
for (int i=;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z); add(y,x,z);
} cost[]=cost_t[]=cost_t[n+]=;
dfs(,-,,,);
ST(tot-); while (q--)
{
scanf("%d",&k);
for (int i=;i<=k;i++) scanf("%d",&a[i]); sort(a+,a++k,cmp); a[k+]=n+; ll ans=cost_t[a[]],lon,maxx=;
int fa=a[];
for (int i=;i<=k;i++)
{
int new_fa=query(fa,a[i]);
int dep1=rmq[pos[fa]],dep2=rmq[pos[new_fa]];
if (dep2<dep1) maxx+=cost[fa]-cost[new_fa]; lon=min(cost_t[a[i]],cost[a[i]]-cost[new_fa]);
maxx=max(maxx,lon); fa=new_fa;
ans=min(ans,max(maxx,cost_t[a[i+]]));
}
printf("%lld\n",ans);
}
}
return ;
}
ACM-ICPC2018 青岛赛区网络预赛-B- Red Black Tree的更多相关文章
- ACM-ICPC 2018 青岛赛区网络预赛 J. Press the Button(数学)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4056 题意:有一个按钮,时间倒计器和计数器,在时间[0,t]内, ...
- ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心)
ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心) Trace 问答问题反馈 只看题面 35.78% 1000ms 262144K There's a beach in t ...
- ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)
ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...
- ACM-ICPC 2018 沈阳赛区网络预赛 K Supreme Number(规律)
https://nanti.jisuanke.com/t/31452 题意 给出一个n (2 ≤ N ≤ 10100 ),找到最接近且小于n的一个数,这个数需要满足每位上的数字构成的集合的每个非空子集 ...
- ACM-ICPC 2018 南京赛区网络预赛 J.sum
A square-free integer is an integer which is indivisible by any square number except 11. For example ...
- ACM-ICPC 2018 南京赛区网络预赛 E题
ACM-ICPC 2018 南京赛区网络预赛 E题 题目链接: https://nanti.jisuanke.com/t/30994 Dlsj is competing in a contest wi ...
- ACM-ICPC 2018 南京赛区网络预赛B
题目链接:https://nanti.jisuanke.com/t/30991 Feeling hungry, a cute hamster decides to order some take-aw ...
- ACM-ICPC 2018 焦作赛区网络预赛- G:Give Candies(费马小定理,快速幂)
There are N children in kindergarten. Miss Li bought them NNN candies. To make the process more inte ...
- ACM-ICPC 2018 焦作赛区网络预赛- L:Poor God Water(BM模板/矩阵快速幂)
God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him t ...
随机推荐
- 团队Alpha冲刺(九)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...
- vs中如何使用NuGet
在vs中如何打开NuGet? 1.工具→NuGet程序包管理器→程序包管理控制台 2.没有的话,就去 工具→扩展和更新 搜索nuget 如果你点击工具,没看到Nuget这些字样,请注意汉化名字为 ...
- 对Excle的行和列进行检查 单元格类型转换代码 ;
对Excle的行和列进行检查 转换代码 : ** * 导入信息 */ @Override public List<Object> add(HttpServletRequest reque ...
- 自签证书 doesn't match any of the subject alternative names
出现这个的原因是https中的域名或者IP,与证书中登记的不一致. 如果是自签证书的话,可以根据具体需要重新生成证书. 还有一种解决方案是在java中跳过这个检查. 绕过检查分两类,一个是绕过证书在C ...
- flink ha zk集群迁移实践
flink为了保证线上作业的可用性,提供了ha机制,如果发现线上作业失败,则通过ha中存储的信息来实现作业的重新拉起. 我们在flink的线上环境使用了zk为flink的ha提供服务,但在初期,由于资 ...
- [C/C++] 指针数组和数组指针
转自:http://www.cnblogs.com/Romi/archive/2012/01/10/2317898.html 这两个名字不同当然所代表的意思也就不同.我刚开始看到这就吓到了,主要是中文 ...
- Spring异步事件
1.发布事件 @Data public class CustomEvent extends ApplicationEvent implements Serializable { private Boo ...
- C++函数中的那些坑
平时写程序时,我们可能或多或少对一些用法感到朦胧,下面我对一些易困惑大家,或者易用错的地方作点介绍. 一.函数的一些注意点 1.函数返回类型不能是数组类型或函数类型,但可以是指向数组或函数的指针. 2 ...
- Day21-获取用户请求相关信息及请求头
1. request里面还包含请求头等信息,可以打印看一下. views.py中的程序 from django.shortcuts import render,HttpResponse from dj ...
- [AT2557] [arc073_c] Ball Coloring
题目链接 AtCoder:https://arc073.contest.atcoder.jp/tasks/arc073_c 洛谷:https://www.luogu.org/problemnew/sh ...