博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF 519E(树上倍增求lca)
阅读量:6246 次
发布时间:2019-06-22

本文共 1073 字,大约阅读时间需要 3 分钟。

 

传送门:

题意:给定一棵树,每次询问到达点u,v距离相等的点有多少个。

分析:按情况考虑:

1.abs(deep[u]-deep[v])%2==1时,必定不存在到达u,v距离相等的点。

2.如果deep[u]==deep[v]时,ans=n-num[lca(u,v)u在的儿子树]-num[lca(u,v)v在的儿子树]。

3.如果deep[u]!=deep[v]时,在u到v的路径中找出到达u,v相等的节点x,则ans=num[x]-num[u在的x儿子树].

#include 
#include
#include
#include
#include
#include
#include
#define N 200010#define LL long long#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;struct edge{ int v,next; edge() {} edge(int v,int next):v(v),next(next) {}} e[N];int head[N],tot;int num[N],deep[N];int fa[N][20];void init(){ memset(head,-1,sizeof(head)); tot=0;}void addedge(int u,int v){ e[tot]=edge(v,head[u]); head[u]=tot++;}void dfs(int x,int f){ for(int i=1; i<20; i++) { if(deep[x]<(1<
=0; i--) { if(fa[x][i]!=fa[y][i]) { x=fa[x][i]; y=fa[y][i]; } } if(x==y)return x; return fa[x][0];}int main(){ int n,m; while(scanf("%d",&n)>0) { init(); for(int i=1; i
View Code

 

转载于:https://www.cnblogs.com/lienus/p/4306534.html

你可能感兴趣的文章
scp命令
查看>>
02-Java中的对象和类
查看>>
if 判断语句
查看>>
tornado+websocket+mongodb实现在线视屏文字聊天
查看>>
如何使用VSTS做压力测试
查看>>
生成树计数算法
查看>>
VS10_慢_优化
查看>>
二维数组赋值
查看>>
java语言之面向对象的概念和和类与对象的基础知识
查看>>
python之复数
查看>>
(转)dp和dip是同一个单位
查看>>
ios 程序发布使用xcode工具Application Loader 正在通过ITUNES STORE进行鉴定错误
查看>>
Spark 调优
查看>>
[工具]类QQ消息通知,提示博客园发布新文章(一)
查看>>
react 学习前期用到的插件
查看>>
PAT1040. Longest Symmetric String (25)(回文串:dp)
查看>>
BZOJ1854: [Scoi2010]游戏 二分图
查看>>
简单的正则表达式方法字符串替换
查看>>
第三章:垃圾回收器-年轻代收集器
查看>>
页面置换算法
查看>>