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 ...
随机推荐
- Pytorch-创建tensor
引言 本篇介绍创建tensor的几种方式 Import from numpy from_numpy() float64 是 double 类型,也就是说从numpy导入的float其实是double类 ...
- linux中为什么删除文件比创建文件要快,读取文件和删除文件的过程是什么?
一.为什么删除文件比创建文件要快? 因为删除文件只是将bitmap位图表中将文件所占据的inode 和dacablock的使用状态从1变成0,相当于释放了这些快的使用权. 二.读取文件和删除文件的过程 ...
- PJzhang:python基础入门的7个疗程-three
猫宁!!! 参考链接:易灵微课-21天轻松掌握零基础python入门必修课-售价29元人民币 https://www.liaoxuefeng.com/wiki/1016959663602400 第七天 ...
- jvm的学习笔记:二、类的初始化,代码实战(4)
当接口被初始化的时候,不要求其父类被初始化 System.out.println(MyChild5.c); 输出: MyChild5 1 依据:new Random().nextInt(3)并非编译区 ...
- netcore程序部署 ubuntu 16.0.4 报错 The type initializer for 'System.Net.Http.CurlHandler'的解决方案
最近业务扩展需要把netcore程序部署到ubuntu 16.0.4上,因为代码里面用到了HttpClient 请求. 部署ubuntu后一直报错 参考地址:https://github.com/do ...
- linux shadow文件格式弱口令解密
shadow格式弱口令为linux弱口令,通过kali linux 终端 john --w=字典 加上shadow文件, 扫描完成之后通过john --show 加上shadow文件出结果
- 云风协程库coroutine源码分析
前言 前段时间研读云风的coroutine库,为了加深印象,做个简单的笔记.不愧是大神,云风只用200行的C代码就实现了一个最简单的协程,代码风格精简,非常适合用来理解协程和用来提升编码能力. 协程简 ...
- cm_api
cm API:https://github.com/cloudera/cm_api/tree/master/python/examples/auto-deploy#看集群有几个clustercurl ...
- Spring IOC 和Aspectj AOP
1.Aspectj AOP 是一套独立的AOP 解决方案,不仅限于java应用,不依赖其他方案,属于编译时增强,有自己单独的编译器.Spring AOP 是基于Spring 容器的的AOP解决方式,属 ...
- python-连接mysql实例
import pymysql # 创建连接 conn = pymysql.connect(host='192.168.71.140', port=3306, user='root', passwd=' ...