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 ...
随机推荐
- Delphi GetDir 获取指定驱动器的当前路径名
//获取指定驱动器的当前路径名 GetDirvardir: string;b: Byte;beginb := 0;GetDir(b,dir);ShowMessage(dir); // //第一个参数: ...
- 【D3D12学习手记】CPU/GPU Synchronization
由于有两个并行运行的处理器(CPU和GPU),会出现许多同步问题.假设我们有一些资源R存储了我们希望绘制的某些几何体的位置. 此外,假设CPU更新R的数据以存储位置p1,然后将引用R的绘图命令C添加到 ...
- webrtc实现点对点视频通讯
html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- markdown-博客编辑
1. 快捷键 2. 基本语法 2.1 字体设置斜体.粗体.删除线 2.2 分级标题 2.3 链接 2.4 分割线 2.5 代码块 2.6 引用 2.7 列表 2.8 表格 3. 常用技巧 3.1 换行 ...
- C#编程 socket编程之TcpClient,TcpListener,UdpClient
应用程序可以通过 TCPClient.TCPListener 和 UDPClient 类使用传输控制协议 (TCP) 和用户数据文报协议 (UDP) 服务.这些协议类建立在 System.Net.So ...
- 338.比特位计数( Counting Bits)leetcode
附上:题目地址:https://leetcode-cn.com/problems/counting-bits/submissions/ 1:题目: 给定一个非负整数 num.对于 0 ≤ i ≤ nu ...
- Linux C/C++基础 文件(中)
1.ubuntu cat命令的实现 cat——查看或者合并文件内容 #include<stdio.h> int main(int argc,char* argv[]) { //1.打开文件 ...
- CentOS6、7升级Openssh至7.9
出于安全考虑,定期使用Nessus对服务器进行扫描,最新Nessus提示服务器的SSH版本有漏洞,所以把SSH升级到最新版本 1.为了防止升级失败登陆不了,所以需要安装telnet mkdir /ro ...
- PTA(Basic Level)1077.互评成绩计算
在浙大的计算机专业课中,经常有互评分组报告这个环节.一个组上台介绍自己的工作,其他组在台下为其表现评分.最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个最高分和一个最低分,剩下的分数取平 ...
- Git及码云学习总结
前言 一.Git是一个版本管理工具软件. 二.windows 系统的使用: 1.git软件的安装:https://git-scm.com/downloads mac系统是自带的不用安装 windows ...