倍增法求lca:暗的连锁
https://loj.ac/problem/10131
#include<bits/stdc++.h>
using namespace std;
struct node{
int to,next;
}e[];
int head[],num=,N,n,m,ans;
int grand[][],depth[];
int f[],w[];
inline void add(int x,int y)
{
e[++num].to=y,e[num].next=head[x],head[x]=num;
}
inline void read(int &x)
{
x=;int f=;
char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
x*=f;
}
void dfs(int x)
{
for(int i=;i<=N;i++)grand[x][i]=grand[grand[x][i-]][i-];
for(int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(v==grand[x][])continue;
depth[v]=depth[x]+;
grand[v][]=x;
dfs(v);
}
}
void init()
{
N=floor(log(n+0.0)/log(2.0));
depth[]=;
dfs();
}
inline int lca(int a,int b)
{
if(depth[a]>depth[b]) swap(a,b);
for(register int i=N;i>=;i--)
{
if(depth[a]<depth[b]&&depth[grand[b][i]]>=depth[a]) b=grand[b][i];
}
if(a==b)return a;
for(register int i=N;i>=;i--)
{
if(grand[a][i]!=grand[b][i]){a=grand[a][i],b=grand[b][i];}
}
return grand[a][];
}
void solve(int u,int fa)
{
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;if(v==fa) continue;
solve(v,u);f[u]+=f[v];
}
}
int main()
{
read(n),read(m);
for(int i=;i<n;i++)
{
int u,v;
read(u),read(v);
add(u,v);
add(v,u);
}
init();
for(int i=;i<=m;i++)
{
int x,y;
read(x),read(y);
w[x]++;w[y]++;
w[lca(x,y)]-=;
}
for(int i=;i<=n;i++) f[i]=w[i];
solve(,);
for(int i=;i<=n;i++)
{
if(f[i]==) ans+=m;
else if(f[i]==) ans++;
}
cout<<ans;
}
倍增法求lca:暗的连锁的更多相关文章
- HDU 2586 倍增法求lca
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 倍增法求LCA
倍增法求LCA LCA(Least Common Ancestors)的意思是最近公共祖先,即在一棵树中,找出两节点最近的公共祖先. 倍增法是通过一个数组来实现直接找到一个节点的某个祖先,这样我们就可 ...
- 倍增法求lca(最近公共祖先)
倍增法求lca(最近公共祖先) 基本上每篇博客都会有参考文章,一是弥补不足,二是这本身也是我学习过程中找到的觉得好的资料 思路: 大致上算法的思路是这样发展来的. 想到求两个结点的最小公共祖先,我们可 ...
- 树上倍增法求LCA
我们找的是任意两个结点的最近公共祖先, 那么我们可以考虑这么两种种情况: 1.两结点的深度相同. 2.两结点深度不同. 第一步都要转化为情况1,这种可处理的情况. 先不考虑其他, 我们思考这么一个问题 ...
- 倍增法求LCA(最近公共最先)
对于有根树T的两个结点u.v,最近公共祖先x=LCA(u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. 如图,根据定义可以看出14和15的最近公共祖先是10, 15和16的最近公共 ...
- 在线倍增法求LCA专题
1.cojs 186. [USACO Oct08] 牧场旅行 ★★ 输入文件:pwalk.in 输出文件:pwalk.out 简单对比时间限制:1 s 内存限制:128 MB n个被自 ...
- 倍增法求LCA代码加详细注释
#include <iostream> #include <vector> #include <algorithm> #define MAXN 100 //2^MA ...
- 浅谈倍增法求解LCA
Luogu P3379 最近公共祖先 原题展现 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入格式 第一行包含三个正整数 \(N,M,S\),分别表示树的结点个数.询问 ...
- RMQ(倍增法求ST)
解决什么问题:区间查询最值 倍增思想:每次得出结果的范围呈2的幂次增长,有人说相当于二分,目前我觉得相当于线段树的查找. 具体理解看代码: /*倍增法求ST*/ #include<math.h& ...
随机推荐
- [转帖]DCEP:中国自己的数字货币
DCEP:中国自己的数字货币 https://cloud.tencent.com/developer/news/435883 前面我们讨论了Libra的革命性和局限性,接下来我想跟你聊一件重要的事,那 ...
- sync包 — 汇总
sync包 package main; import ( "time" "fmt" ) func main() { //time.Time代表一个纳秒精度的时间 ...
- 08-Maps
Maps map 是在 Go 中将值(value)与键(key)关联的内置类型.通过相应的键可以获取到值.Maps类似于python中的字典 Maps定义 maps的key值必须是可hash(就是不可 ...
- TiDB基本架构简单总结
TiDB特点 高可用 水平拓展 事务 SQL支持 TiDB架构 和MySql不同,TiDB是一个分布式的数据库而不是单个进程,所以整个TiDB是由以下角色组成: TiKV, PD, TiDB, T ...
- [洛谷P5329][SNOI2019]字符串
题目大意:给一个长度为$n$的字符串$s$,字符串$p_i$为字符串$s$去掉第$i$个字符后形成的字符串.请给所有字符串$p_i$排序(相同字符串按编号排序) 题解:先去掉所有连续相同字符,因为它们 ...
- OI数学汇总
最前面:\(\LaTeX\)可能需要加载一会,请耐心等待o~ 前言 数学在\(\text{OI}\)中十分重要.其中大多都是数论. 什么是数论? \[ 研究整数的理论 --zzq \] 本文包含所有侧 ...
- GRE
第一个技术是GRE,全称Generic Routing Encapsulation,它是一种IP-over-IP的隧道技术.它将IP包封装在GRE包里,外面加上IP头,在隧道的一端封装数据包,并在通路 ...
- C# vb .net实现透视反射效果
在.net中,如何简单快捷地实现Photoshop滤镜组中的透视反射效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...
- Java Web 深入分析(11) JVM(1)
前言 Java启动后作为一个进程运行在操作系统中,该进程要分配的内存有以下几个: 1.Java堆: 存储java内存区域,堆大小是在jvm启动时就像操作系统申请完成,其中 -Xmx和-Xms 分别表示 ...
- 9 同时搜索多个index,或多个type
搜索所有index(慎用): GET /_search 搜一个索引下,所有type,(不指定type即可) GET /beauties/_search 搜多个索引,则多个索引间,用逗号(,)分隔开 ...