LCA。。。

树链剖分

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=5e5+10;int h[N],e[2*N],ne[2*N],idx=0;
void add(int u,int v){e[idx]=v,ne[idx]=h[u],h[u]=idx++;return;}int siz[N],de[N],son[N],top[N],fa[N],id[N],num;
void dfs1(int u,int f)  //一次dfs求出深度,父亲,重儿子; 
{de[u]=de[f]+1;   fa[u]=f;    siz[u]=1;   //包括自己 可能是更进一步修改整棵子树的时候好做吧,现在不知道; for(int i=h[u];~i;i=ne[i]){int t=e[i];if(t==f)continue;   dfs1(t,u);siz[u]+=siz[t];if(siz[son[u]]<siz[t])son[u]=t; //如果是叶子节点进不来这层,son【u】=0; }return ;
}
void dfs2(int u,int f) //求出链头,轻链的链头是自己,重链的链头是重链最上面的元素; 
{	top[u]=f;         //f是u的链头 if(!son[u])return ;//是叶子节点返回 dfs2结束条件,不加的话 dfs2(son[u],f)就过深,一般不加,因为dfs再for循环里面; dfs2(son[u],f);    //重链的链头是f; for(int i=h[u];~i;i=ne[i]){int v=e[i];if(v==fa[u]||v==son[u])continue; //不可以写成v==f,因为轻链的链头是他自己; dfs2(v,v);  //轻链的链头是他自己; }
}
int LCA(int x,int y)
{while(top[x]!=top[y])//当不在一条链上; {if(de[top[x]]<de[top[y]])swap(x,y);//链头较深的先上 ; x=fa[top[x]];//到到这条链的下一条链的链尾; }return de[x]<de[y]?x:y;
}
int main()
{memset(h,-1,sizeof h);//这句如果初始化idx=1&&只用建一个图,那么不用初始化h了; int n,m,s;scanf("%d%d%d",&n,&m,&s);for(int i=1,u,v;i<n;i++){scanf("%d%d",&u,&v);add(u,v);add(v,u);} dfs1(s,0);dfs2(s,s);while(m--){int a,b;scanf("%d%d",&a,&b);printf("%d\n",LCA(a,b));}return 0;
}

倍增

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N=5e5+10;
int fa[N][31],deep[N];
vector<int>v[N];
int n,m,s,a,b,c,ans=0;void dfs(int root,int fno)
{fa[root][0]=fno;deep[root]=deep[fno]+1;for(int i=1;i<31;i++)fa[root][i]=fa[fa[root][i-1]][i-1];int sz=v[root].size();for(int i=0;i<sz;i++){int t=v[root][i]; if(t==fno)continue;dfs(t,root);}
}
int lca(int x,int y)
{if(deep[x]>deep[y])swap(x,y);int sz=deep[y]-deep[x];    for(int i=0;sz;i++,sz>>=1)//先走到同一高度,那么再走相同的步数就到lca的前一个点; if(sz&1)y=fa[y][i];if(x==y)return x;       //特判; for(int i=30;i>=0;i--)  //为啥要走到零呢?。。难道是走到lca的前一个点;??? if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];  return fa[x][0];        //lca的前一个点的下一个点是lca(当是废话吧) 
}int main()
{scanf("%d%d%d",&n,&m,&s);for(int i=1;i<=n;i++)v[i].clear();for(int i=1;i<n;i++){scanf("%d%d",&a,&b);v[a].push_back(b),v[b].push_back(a);}dfs(s,0);for(int i=0;i<m;i++){scanf("%d%d",&a,&b);printf("%d\n",lca(a,b));}return 0;
}

好像第二个代码好看。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

张队长主讲这堂 .NET Core技术培训公开课,太原你约不约

这堂.NET Core技术培训课&#xff0c;你不能错过各位开发者朋友们想必也能体会到&#xff0c;现在市面上关于.NET Core的培训课程少之又少&#xff0c;其中有质量有内容的课程更是凤毛麟角&#xff0c;良师难遇&#xff0c;一课难求。但是现在&#xff0c;机会来了。中微云孵邀…

L :WeChat Walk

详见代码 #include<cstdio> #include<iostream> #include<cstring> #include<vector> #include<map> #include<algorithm> #include<cmath> using namespace std; typedef long long ll; const int N2e510;int h[N],e[N<<1],…

微软推出新语言Bosque,超越结构化程序设计

微软近期推出了一款全新的编程语言 Bosque&#xff0c;该语言参考了 TypeScript 的语法与类型&#xff0c;还有 ML 和 Node/JavaScript 的语义。作者微软计算机科学家 Mark Marron 致力于消除编程过程中出现的各种复杂情况&#xff0c;创造出了他认为超越主流结构化程序设计的 …

Acwing202. 最幸运的数字

Acwing202. 最幸运的数字 题意&#xff1a; 现在给定一个正整数 L&#xff0c;请问至少多少个 8 连在一起组成的正整数&#xff08;即最小幸运数字&#xff09;是 L 的倍数。 题解&#xff1a; x个8连在一起组成的正整数可写作8(10x−1)/98(10^x-1)/98(10x−1)/9。现在要求…

Black and white

在1-n&#xff0c;1-m里选nm-1个边&#xff0c;不形成环的话那就可以补全图形。。。还是不懂 #include<iostream> #include<cstring> using namespace std; const int N6000; typedef long long ll; int l[N],r[N],A[N*N]; int ma[N][N],dis[NN]; int n,m,a,b,c,…

Sumdiv POJ - 1845

Sumdiv POJ - 1845 题意&#xff1a; 求ABA^BAB的所有约数之和mod 9901(1<A,B<5e7) 题解&#xff1a; 我们先将A分解质因子&#xff0c;表示为&#xff1a;p1c1∗p2c2∗......∗pncnp_{1}^{c_{1}}*p_{2}^{c_{2}}*......*p_{n}^{c_{n}}p1c1​​∗p2c2​​∗......∗pn…

vue 实验报告8 基于Nuxt.js开发一个Vue程序,实现登录和注册切换

一、步骤&#xff1a; 保证node.js版本在14以上 1. 全局安装create-nuxt-app: npm install -g create-nuxt-app2.9.x 2. 创建项目: create-nuxt-app my-nuxt-demo 选项这么选&#xff1a; 然后输入&#xff1a; cd my-nuxt-demo 3. 创建登录和注册页面: 在/pages目录下创建logi…

解决vs2019中暂时无法为.net core WinForms使用 Designer 的临时方法

以下方法来自于微软github开源项目WinForms:dotnet/winforms - Using the Classic WinForms Designer in WinForms Core, 请放心使用 .目前.net core下的 Windows Forms的可视化设计器(Designer)尚不可用&#xff0c;后续的Visual Studio 2019 Update才会支持该部分的功能。不过…

P2480 [SDOI2010]古代猪文(数论好题)

P2480 [SDOI2010]古代猪文 题意&#xff1a; 给你n和g&#xff0c;求g∑d∣nCndmodpg^{\sum_{d|n}C_{n}^{d}}\bmod pg∑d∣n​Cnd​modp p999911659 题解&#xff1a; 这个一个综合性很强的数论题 涉及到欧拉定理&#xff0c;Lucas定理&#xff0c;中国剩余定理&#xff0c…

ASP.NET Core开发者成长路线图

来源: MoienTajik/AspNetCore-Developer-Roadmap.2019年ASP.NET Core开发者指南:你可以在下面找到一张图&#xff0c;该图展示了你可以选取的路径及你想学习的库&#xff0c;从而成为一名 ASP.NET Core 开发者。“作为 ASP.NET Core 开发者&#xff0c;我接下来应该学习什么&am…

P2183 [国家集训队]礼物(扩展卢卡斯)

P2183 [国家集训队]礼物 题意&#xff1a; 有n个礼物&#xff0c;分给m个人&#xff0c;分给第i个人的礼物数量是wi&#xff0c;问送礼物的方案数。 题解&#xff1a; 扩展卢卡斯模板题 很容易看出和组合数有关的题目&#xff0c;对于总方案&#xff0c;完美可以将其分解为…

Eyjafjalla

区间查询有关比大小的数目&#xff0c; 主席树感觉学线段树的时候不用x<<1,x<<1|1去建一次树那样就容易理解多了&#xff1b; #include<cstdio> #include<iostream> #include<cstring> #include<vector> #include<queue> #include…

P4345 [SHOI2015]超能粒子炮·改

P4345 [SHOI2015]超能粒子炮改 题意&#xff1a; 求解式子∑i0kCni%p\sum_{i0}^{k}C_{n}^{i} \% p∑i0k​Cni​%p n,k<1e18 题解&#xff1a; 设f(n,k)∑i0kCnif(n,k)\sum_{i0}^{k}C_{n}^{i}f(n,k)∑i0k​Cni​ 开始化简&#xff1a; 由卢卡斯定理得&#xff1a; f(n,k)…

.NET Framework VS .NET Core

本文对应的原文来至 c-sharpcorner 的一篇文章&#xff0c;文末有链接。如有错误&#xff0c;还请指正。前言你会为你的下一个应用程序选择哪一种开发平台 - .NET Framework 或者 .NET Core&#xff1f;在这篇文章中&#xff0c;让我们比较一下这两个开发平台的特点&#xff0c…

P6669 [清华集训2016] 组合数问题

P6669 [清华集训2016] 组合数问题 题意&#xff1a; 给你n&#xff0c;m&#xff0c;k&#xff0c;问有多少对(i,j)满足K∣CijK|C_{i}^{j}K∣Cij​ (Cij是k的倍数C_{i}^{j}是k的倍数Cij​是k的倍数) n,m<1e18 题解&#xff1a; n和m非常大&#xff0c;非常非常大&#x…

解决 VS2019 中.net core WPF 暂时无法使用 Designer 的临时方法

以下方法来自于微软github开源项目WPF:dotnet/samples - WPF Hello World sample with linked files&#xff0c;请放心使用。此篇文章是上篇文章解决vs2019中暂时无法为.net core WinForms使用 Designer 的临时方法的姊妹篇&#xff0c;但对WPF而言实现起来比WinForms简单很多…

Building Fire Stations

题目链接 首先找到树的直径&#xff0c;直径左端点是a&#xff0c;直径右端点是b&#xff0c;中间的点是mid&#xff08;偶数的情况下mid可以看做两个&#xff09;&#xff0c;两点因该是左右分布&#xff1b; 假设两点都不在直径上&#xff0c;那么移到直径上的话距离更短&a…

.NET Core 迁移躺坑记

最近将自己负责的一个核心接口系统从.Net Framework迁移到了.Net Core。整体过程&#xff0c;从业务层面说一般般吧(整体还好但还是搞的业务有感&#xff0c;没出严重故障&#xff09;但是技术层面上感觉其实并没有达到要求&#xff0c;不过预期也是应该不会那么顺利&#xff0…

P4720 【模板】扩展卢卡斯定理/exLucas(无讲解,纯记录模板)

P4720 【模板】扩展卢卡斯定理/exLucas 题意&#xff1a; CnmmodpC_{n}^{m}\bmod pCnm​modp 对于 100% 的数据&#xff0c;1≤m≤n≤1018&#xff0c;2≤p≤106&#xff0c;不保证 p 是质数。 题解&#xff1a; 模板题&#xff0c;单纯写本文章记录板子 代码&#xff1a; …

[Abp vNext 源码分析] - 2. 模块系统的变化

一、简要说明本篇文章主要分析 Abp vNext 当中的模块系统&#xff0c;从类型构造层面上来看&#xff0c;Abp vNext 当中不再只是单纯的通过 AbpModuleManager 来管理其他的模块&#xff0c;它现在则是 IModuleManager 和 IModuleLoader 来协同工作&#xff0c;其他的代码逻辑并…