ZOJ red black tree
#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的更多相关文章
- [转载] 红黑树(Red Black Tree)- 对于 JDK TreeMap的实现
转载自http://blog.csdn.net/yangjun2/article/details/6542321 介绍另一种平衡二叉树:红黑树(Red Black Tree),红黑树由Rudolf B ...
- 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 ...
- Red Black Tree 红黑树 AVL trees 2-3 trees 2-3-4 trees B-trees Red-black trees Balanced search tree 平衡搜索树
小结: 1.红黑树:典型的用途是实现关联数组 2.旋转 当我们在对红黑树进行插入和删除等操作时,对树做了修改,那么可能会违背红黑树的性质.为了保持红黑树的性质,我们可以通过对树进行旋转,即修改树中某些 ...
- CF1208H Red Blue Tree
CF1208H Red Blue Tree 原本应该放在这里但是这题过于毒瘤..单独开了篇blog 首先考虑如果 $ k $ 无限小,那么显然整个树都是蓝色的.随着 $ k $ 逐渐增大,每个点都会有 ...
- ZOJ - 4048 Red Black Tree (LCA+贪心) The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online
题意:一棵树上有m个红色结点,树的边有权值.q次查询,每次给出k个点,每次查询有且只有一次机会将n个点中任意一个点染红,令k个点中距离红色祖先距离最大的那个点的距离最小化.q次查询相互独立. 分析:数 ...
- 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 ...
- 计蒜客 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 ...
- Red Black Tree(红黑树)
(修改于 2018-05-06 15:53:22 还差删除维护操作.层序遍历没完成.维护操作没完成不想写层序遍历怎么办...) 今天下午完成了红黑树的插入的维护操作,但删除的维护操作还没有解决,删除的 ...
- ZOJ 3965 Binary Tree Restoring
Binary Tree Restoring 思路: 递归 比较a序列和b序列中表示同一个子树的一段区间,不断递归 代码: #include<bits/stdc++.h> using nam ...
随机推荐
- 使用第三方UITableView+FDTemplateLayoutCell计算cell行高注意点
现在很方便的计算单元格的行高大部分都是使用的第三方框架UITableView+FDTemplateLayoutCell,不知道你在使用这个框架的时候有没有遇到和我一样的问题,比如: 在这样计算cell ...
- "美团"APP学习记录知识点
1.APP进入加载广告视图展示: -(void)initAdvView{ // 判断图片是否已经存在 NSArray *paths = NSSearchPathForDirectoriesInDoma ...
- sql 死锁查看
--每秒死锁数量 SELECT * FROM sys.dm_os_performance_counters WHERE counter_name LIKE 'Number of Deadlocksc% ...
- Java ——注释 命名
注释 1.类在每个类前面必须加上类注释,注释模板如下:/*** Copyright (C), 2006-2010, ChengDu Lovo info. Co., Ltd.* FileName: Te ...
- Java利用PushbackReader实现返回对文本中的指定字符串之前的内容
import java.io.FileReader; import java.io.PushbackReader; public class PushbackTest { public static ...
- 02-初识CSS
一. CSS介绍 CSS:Cascading Style Sheet,层叠样式表.CSS的作用就是给HTML页面标签添加各种样式,定义网页的显示效果.简单一句话:CSS将网页内容和显示样式进行分离,提 ...
- PostgreSQL中with和without time zone两者有什么区别
with和without time zone两者有什么区别 1.区别 1)名字上看一个是带时区的,另一个是不带时区的,查出来的时间是一样的,只是一个带时区标志,一个不带而已,时区的基准是格林威治时间U ...
- ~艾比郎~学Python之Python基础
第一步: 尝试写Hello World程序 这是我用Python写出的第一个程序,我的一小步,我人生的一大步 在linux 下创建一个文件叫hello.py,如图所示 然后执行命令:python he ...
- 纯前端表格控件SpreadJS V12.1 隆重登场,专注易用性,提升用户体验
一款优秀的开发工具,在更新迭代中,除了要满足不同场景的业务需求,也需不断优化已有功能,尤其是细节方面,要能为用户带来使用体验和开发效率的提升. 作为一款备受业界专家和开发者认可的纯前端类Excel ...
- Configure脚本支持说明
在Linux上安装Nginx需要执行Configure脚本,该脚本需要做一些参数说明: 选项 说明 --prefix=<path> 指定Nginx软件的安装路径,若不指定默认安装在/usr ...