BZOJ 3910 火车 倍增LCA
本题并不需要并查集,每次查询一次最近公共祖先,并倍增求出需要被新标记的路径。
这样保证时间复杂度是 O(nlogn)O(nlogn)O(nlogn) 的。
Code:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 500000 + 4;
const int logn = 21;
int f[25][maxn], head[maxn], to[maxn << 1], nex[maxn << 1], cnt, n, m, s, dep[maxn];
bool tag[maxn];
long long ans;
inline void add_edge(int u,int v){
nex[++cnt] = head[u];
head[u] = cnt;
to[cnt] = v;
}
void dfs(int u,int fa, int depth)
{
f[0][u] = fa, dep[u] = depth;
for(int v = head[u]; v ; v = nex[v]){
if(to[v] != fa){
dfs(to[v], u, depth + 1);
}
}
}
inline int lca(int a,int b){ //b向 a 爬
if(dep[a] > dep[b]) swap(a,b);
if(dep[a] != dep[b]){
for(int i = logn;i >= 0; --i)
if(dep[f[i][b]] >= dep[a]) b = f[i][b];
}
if(a == b) return a;
for(int i = logn;i >= 0; --i)
{
if(f[i][a] != f[i][b])
{
a = f[i][a], b = f[i][b];
}
}
return f[0][a];
}
inline void connect(int a, int b){
if(tag[a] && tag[b]) return ;
if(dep[a] < dep[b]) swap(a, b); //a 爬向 b
int A = a;
if(tag[A])
{
for(int i = logn;i >= 0;--i)
if(tag[f[i][a]] == 1 ) a = f[i][a];
}
do
{
tag[a] = tag[f[0][a]] = 1;
a = f[0][a];
}while(a != b);
}
int main(){
scanf("%d%d%d",&n,&m,&s);
for(int i = 1;i < n ; ++i){
int a,b;
scanf("%d%d",&a,&b);
add_edge(a,b);
add_edge(b,a);
}
dfs(1, 0, 1);
for(int i = 1;i <= logn; ++i)
for(int j = 1;j <= n; ++j)
f[i][j] = f[i - 1][f[i - 1][j]];
int pre = s;
for(int i = 1;i <= m; ++i){
int cur;
scanf("%d",&cur);
int h = lca(pre, cur);
if(tag[cur] && tag[pre]) continue;
ans +=(long long) dep[cur] + dep[pre] - 2 * dep[h];
connect(pre, h);
connect(cur, h);
pre = cur;
}
printf("%lld",ans);
return 0;
}
BZOJ 3910 火车 倍增LCA的更多相关文章
- 【BZOJ-3910】火车 倍增LCA + 并查集
3910: 火车 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 262 Solved: 90[Submit][Status][Discuss] De ...
- BZOJ 3910: 火车
3910: 火车 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 358 Solved: 130[Submit][Status][Discuss] D ...
- BZOJ 2243: [SDOI2011]染色 树链剖分 倍增lca 线段树
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- BFS+最小生成树+倍增+LCA【bzoj】4242 水壶
[bzoj4242 水壶] Description JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有 ...
- BZOJ 3732 Network —— 最小生成树 + 倍增LCA
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 <= N <= 15, ...
- BZOJ 3732 Network Kruskal+倍增LCA
题目大意:给定一个n个点m条边的无向连通图.k次询问两点之间全部路径中最长边的最小值 NOIP2013 货车运输.差点儿就是原题...仅仅只是最小边最大改成了最大边最小.. . 首先看到最大值最小第一 ...
- [板子]倍增LCA
倍增LCA板子,没有压行,可读性应该还可以.转载请随意. #include <cstdio> #include <cstring> #include <algorithm ...
- 洛谷P3128 [USACO15DEC]最大流Max Flow [倍增LCA]
题目描述 Farmer John has installed a new system of pipes to transport milk between the stalls in his b ...
- Gym100685G Gadget Hackwrench(倍增LCA)
题目大概说一棵边有方向的树,q个询问,每次询问结点u是否能走到v. 倍增LCA搞即可: 除了par[k][u]表示u结点往上走2k步到达的结点, 再加上upp[k][u]表示u结点往上走2k步经过边的 ...
随机推荐
- Ubuntu 18.04 安装 Xfce桌面和VNC的方法
首先安装Xfce4桌面环境.Xfce4是在Unix和Unix-like(Linux, FreeBSD)上运行的开源桌面环境,其特点是快速,轻量,同时拥有美观的交互界面,易于使用. Xfce4的安装十分 ...
- nginx获取经过层层代理后的客户端真实IP(使用正则匹配)
今天帮兄弟项目搞了一个获取客户端真实IP的问题,网上这种问题很多,但是对于我们的场景都不太合用,现把我的解决方案share给大家,如有问题,请及时指出. 场景: 在请求到达后端服务之前,会经过层层代理 ...
- C++基础 (5) 第五天 重载new delete () 只能操作符 自定义string类
1 昨日回顾 1.static 对整个类共享 可以直接用 类::方法 调用 如果是私有的 可以提供一个静态的访问静态成员的方法 2 自定义的数组类-重载操作符[] 3 重载new和delete 4 重 ...
- 使用maven创建springMVC时返回页面报错
这是由于你的 Maven 编译级别是 jdk1.5 或以下,而你导入了 jdk1.6 以上的依赖包 解决办法: <build> <finalName></finalNam ...
- 《代码敲不队》第八次团队作业:Alpha冲刺 第三天
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 代码敲不队 作业学习目标 掌握软件编码实现的工程要求. 团队项目github仓库地址链接 GitH ...
- centos安装wget 及配置
yum -y install wget #yum -y install setup 本文 #yum install perl Searching for GCC... The path "& ...
- redis-ubuntu环境下安装
ubuntu环境下联网安装 进去系统后,首先修改root的密码 命令 sudo passwd 设置新的密码:XXX 切换为root操作 $ wget http://download.redis.io/ ...
- HDU 4345
细心点想,就明白了,题目是求和为N的各数的最小公倍数的种数.其实就是求N以内的各素数的不同的组合(包含他们的次方),当然,是不能超过N的.用Dp能解决.和背包差不多. #include <ios ...
- Leetcode_299_Bulls and Cows
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/50768550 You are playing the fo ...
- 普通androidproject转换为C/C++project之后,再还原成androidproject的解决方式
我们在调试android程序时,可能会把androidproject转换成C/C++project,或者Add Native Support.可是,我们怎么把C/C++project还原成普通的and ...