#include <bits/stdc++.h>
#define fi first
#define se second
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pb push_back
#define MP make_pair
#define lowbit(x) x&-x
#define clr(a) memset(a,0,sizeof(a))
#define _INF(a) memset(a,0x3f,sizeof(a))
#define FIN freopen("in.txt","r",stdin)
#define IOS ios::sync_with_stdio(false)
#define fuck(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int MX = 1e5 + ; int n, m, q, _;
int red[MX];
struct edge
{
int v, nxt;
ll w;
} E[MX << ];
int head[MX], tot, sz;
int id[MX << ], dep[MX << ], first[MX], ST[MX << ][], vis[MX], vec[MX];
ll dis[MX], d[MX];
bool cmp(int a, int b)
{
return d[a] > d[b];
}
void init(int _n)
{
for (int i = ; i <= _n; i++)
{
head[i] = -;
vis[i] = red[i] = dis[i] = d[i] = ;
}
tot = sz = ;
}
void add_edge(int u, int v, ll w)
{
E[tot].v = v;
E[tot].w = w;
E[tot].nxt = head[u];
head[u] = tot++;
}
void dfs(int u, int deep, ll nw)
{
if (red[u])
{
nw = ;
}
d[u] = nw;
vis[u] = ;
id[++sz] = u;
first[u] = sz;
dep[sz] = deep;
for (int i = head[u]; ~i; i = E[i].nxt)
{
int v = E[i].v;
ll w = E[i].w;
if (vis[v])
{
continue;
}
dis[v] = dis[u] + w;
dfs(v, deep + , nw + w);
id[++sz] = u;
dep[sz] = deep;
}
}
void ST_init(int _n)
{
for (int i = ; i <= _n; i++)
{
ST[i][] = i;
}
for (int j = ; ( << j) <= _n; j++)
{
for (int i = ; i + ( << j) < _n; i++)
{
int x = ST[i][j - ], y = ST[i + ( << (j - ))][j - ];
ST[i][j] = dep[x] < dep[y] ? x : y;
}
}
}
int RMQ(int l, int r)
{
int k = ;
while (( << (k + )) <= r - l + )
{
k++;
}
int x = ST[l][k], y = ST[r - ( << k) + ][k];
return dep[x] < dep[y] ? x : y;
}
int LCA(int u, int v)
{
int x = first[u], y = first[v];
if (x > y)
{
swap(x, y);
}
return id[RMQ(x, y)];
} int main()
{
//FIN;
for (scanf("%d", &_); _; _--)
{
scanf("%d%d%d", &n, &m, &q);
init(n);
for (int i = , x; i <= m; i++)
{
scanf("%d", &x);
red[x] = ;
}
for (int i = ; i < n; i++)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
add_edge(u, v, w);
add_edge(v, u, w);
}
dfs(, , );
ST_init(sz);
while (q--)
{
int k;
scanf("%d", &k);
for (int i = ; i <= k; i++)
{
scanf("%d", &vec[i]);
}
sort(vec + , vec + k + , cmp);
ll ans = d[vec[]], lastcnt = ;
int lastlca = vec[];
for (int i = ; i <= k; i++)
{
int lca = LCA(lastlca, vec[i]);
ll res1 = lastcnt + dis[lastlca] - dis[lca];
if (i > && res1 >= d[vec[i - ]])
{
break;
}
ll res2 = min(d[vec[i]], dis[vec[i]] - dis[lca]);
ll cnt = max(res1, res2);
if (cnt >= ans)
{
break;
}
if (i + <= k)
{
ans = min(ans, max(cnt, d[vec[i + ]]));
}
else
{
ans = min(ans, cnt);
}
lastlca = lca;
lastcnt = cnt;
}
printf("%lld\n", ans);
}
}
return ;
}

ZOJ red black tree的更多相关文章

  1. [转载] 红黑树(Red Black Tree)- 对于 JDK TreeMap的实现

    转载自http://blog.csdn.net/yangjun2/article/details/6542321 介绍另一种平衡二叉树:红黑树(Red Black Tree),红黑树由Rudolf B ...

  2. Red–black tree ---reference wiki

    source address:http://en.wikipedia.org/wiki/Red%E2%80%93black_tree A red–black tree is a type of sel ...

  3. Red Black Tree 红黑树 AVL trees 2-3 trees 2-3-4 trees B-trees Red-black trees Balanced search tree 平衡搜索树

    小结: 1.红黑树:典型的用途是实现关联数组 2.旋转 当我们在对红黑树进行插入和删除等操作时,对树做了修改,那么可能会违背红黑树的性质.为了保持红黑树的性质,我们可以通过对树进行旋转,即修改树中某些 ...

  4. CF1208H Red Blue Tree

    CF1208H Red Blue Tree 原本应该放在这里但是这题过于毒瘤..单独开了篇blog 首先考虑如果 $ k $ 无限小,那么显然整个树都是蓝色的.随着 $ k $ 逐渐增大,每个点都会有 ...

  5. ZOJ - 4048 Red Black Tree (LCA+贪心) The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online

    题意:一棵树上有m个红色结点,树的边有权值.q次查询,每次给出k个点,每次查询有且只有一次机会将n个点中任意一个点染红,令k个点中距离红色祖先距离最大的那个点的距离最小化.q次查询相互独立. 分析:数 ...

  6. 2018 ICPC青岛网络赛 B. Red Black Tree(倍增lca好题)

    BaoBao has just found a rooted tree with n vertices and (n-1) weighted edges in his backyard. Among ...

  7. 计蒜客 Red Black Tree(树形DP)

    You are given a rooted tree with n nodes. The nodes are numbered 1..n. The root is node 1, and m of ...

  8. Red Black Tree(红黑树)

    (修改于 2018-05-06 15:53:22 还差删除维护操作.层序遍历没完成.维护操作没完成不想写层序遍历怎么办...) 今天下午完成了红黑树的插入的维护操作,但删除的维护操作还没有解决,删除的 ...

  9. ZOJ 3965 Binary Tree Restoring

    Binary Tree Restoring 思路: 递归 比较a序列和b序列中表示同一个子树的一段区间,不断递归 代码: #include<bits/stdc++.h> using nam ...

随机推荐

  1. Azure sql database 监控存储过程的传参情况

    背景 实施开发的同事找到我,反馈说项目中使用Azure sql database 之后,无法使用Profiler来监控自己开发的存储过程的参数传参情况.确实profiler这些实例级别的工具在Azur ...

  2. Excel不同版本差异性

    apache poi-3.16.jar /* ==================================================================== Licensed ...

  3. iOS源码学习总结框架

    1.ARChromeActivity: 用于在Google Chrome中打开网址的UIActivity子类. 2.KINWebBrowser: 它使用iOS 8的 WKWebView API编写,同 ...

  4. redis的坑

    1.外网无法连接redis 解决方法: 把redis.conf里的bind 127.0.0.1注释掉,不行的话把127.0.0.1修改成0.0.0.0 2.make的时候显示没有gcc 解决方法: 安 ...

  5. Python 输出时去掉列表元组外面的方括号与圆括号

     

  6. __setattr__,__getattr__,__delattr__

    class Foo: x = 1 def __init__(self,y): self.y = y def __getattr__(self,item): print("---->fr ...

  7. Sql Server使用TOP实现Limit m,n的功能

    转载自:https://blog.csdn.net/weixin_41798450/article/details/88885891 在MySQL中,可以用 Limit 来查询第 m 列到第 n 列的 ...

  8. 搭建本地parcel仓库

    参考:https://www.cloudera.com/documentation/enterprise/6/6.2/topics/cm_ig_create_local_parcel_repo.htm ...

  9. Spark中分布式使用HanLP(1.7.0)分词示例

    HanLP分词,如README中所说,如果没有特殊需求,可以通过maven配置,如果要添加自定义词典,需要下载“依赖jar包和用户字典". 分享某大神的示例经验: 是直接"java ...

  10. httprunner - 源码解析

    这里只是做一个大概的解析,还有很多细节部分没有太过于关注 我们从cli.py开始进行解析 1.argparse.ArgumentParser 接受命令行的各种参数 [ argparse.Argumen ...