#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. Could not resolve host: mirrorlist.centos.org Centos 7 Unkown error

    安装Centos7(core)以后,网卡默认不会启用.这是一个大坑,直接报错,这是一个过度优化,有几个开发人员/运维人员安装centos7(core)不用ssh去连接服务器的. 报错如下: Loade ...

  2. python(29)Tinker+BeautifulSoup+Request抓取美女壁纸

    原文链接:http://www.limerence2017.com/2019/10/22/python29/ 抓取准备 今天是10月24日,祝所有程序员节日快乐.今天打算写个爬虫抓取3DMGAME论坛 ...

  3. C语言:“冒泡排序”与“二分法”

    1.冒泡排序: what:将元素进行两两比较,大的(小的)向后排. when:数组中有多个元素,需要进行比较排序比较的时候使用. how:N个数字来排队,两两比较小靠前.(升序) 外层循环:N-1(控 ...

  4. 1031: [编程入门]自定义函数之字符串反转(python)

    问题 1031: [编程入门]自定义函数之字符串反转 时间限制: 1Sec 内存限制: 128MB 提交: 7225 解决: 3331 题目描述 写一函数,使输入的一个字符串按反序存放,在主函数中输入 ...

  5. Python基础知识(程序结构)

    流程控制语句 选择语句.条件表达式.循环语句.跳转语句.pass空语句 程序结构三种基本结构 顺序结构.选择结构.循环结构 顺序结构 按照代码顺序依次运行 选择结构 根据条件表达式结果选择执行不同的语 ...

  6. C学习笔记-枚举

    枚举定义 可以使用枚举(enumerated type)声明代表整数常量的符号名称,关键字enum创建一个新的枚举类型 实际上,enum常量是int类型的 枚举的本质就是int型的常量 enum sp ...

  7. flask_migrate 的应用

    怎么查看的命令: python manage.py --help 使用flask_migrate的注意事项:

  8. HTML笔记(三) 表格和列表

    本篇记录表格 (table) 和有序列表 (ordered list) \ 无序列表 (unordered list) 的部分用法 1.表格table 表格标签 使用 <table> 定义 ...

  9. springmvc的MultipartFile参数如果不上传文件报错的问题

    @RequestMapping(value = "/updateInformation",method = RequestMethod.POST) @ResponseBody pu ...

  10. 谷歌官方颜色库 MaterialDesignColor

    谷歌官方颜色库 MaterialDesignColor