当前位置: 首页 > news >正文

手机网站建设联系方式舆情监测分析系统

手机网站建设联系方式,舆情监测分析系统,这么建立com的网站,烟台建设工程施工图审查系统网站LCA(Lowest Common Ancestor) 定义 在树上取两点 x,yx,y,他们的 LCA 为距离他们最近的公共祖先。 本章主要讲的是倍增求 LCA。 暴力求取 从 xx 开始向上移动到根结点,并标记沿途结点。从 yy 开始向上移动到根结点&#xff0c…

LCA(Lowest Common Ancestor)

定义

在树上取两点 x,yx,y,他们的 LCA 为距离他们最近的公共祖先。

本章主要讲的是倍增求 LCA。

暴力求取

  1. 从 xx 开始向上移动到根结点,并标记沿途结点。
  2. 从 yy 开始向上移动到根结点,第一个被标记的就是 xx 和 yy 的 LCA。

倍增求 LCA

从任意点对 (x,y)(x,y) 移到 xx 和 yy 的 LCA 的距离可拆分为 22 的幂的和。

若预处理任意点 xx 移动 22 的幂步所到达的结点编号,则不超过 \log_2{n}log2​n 次即可找到 LCA。

具体实现

first:预处理倍增 DP

定义状态 dp_{i,j}dpi,j​ 表示点 ii 向上移动 2^j2j 步到达的结点编号。

状态转移方程:枚举 jj 从 11 到 \log_2 nlog2​n,dp_{i,j}=dp_{dp_{i,j-1},j-1}dpi,j​=dpdpi,j−1​,j−1​。

初始状态:dp_{i,0}=fa_idpi,0​=fai​。

代码片段
void pre_lca(int cur, int fa)
{dep[cur]=dep[fa]+1;dp[cur][0]=fa;for(int i=1;(1<<i)<=dep[cur];i++){dp[cur][i]=dp[dp[cur][i-1]][i-1];}for(int nxt:nbr[cur]){if(nxt!=fa)pre_lca(nxt,cur);}
}
second:处理单次询问

第一步:约定深度较大的点,若 dep_x>dep_ydepx​>depy​,交换 xx 和 yy。

第二步:将深度较大的结点 yy 倍增向上跳至深度等于 xx。

第三步:判断 xx 是否等于 yy。若已经相等则 xx 为 LCA,停止寻找。

第四步:xx 和 yy 一起倍增向上跳,只要 xx 和 yy 不重合。

第五步:xx 向上一步即为 LCA。

代码片段
int lca(int x, int y)
{if(dep[y]<dep[x])swap(x,y);for(int i=20;i>-1;i--){if(dep[dp[y][i]]>=dep[x]){y=dp[y][i];}}if(x==y)return x;for(int i=20;i>-1;i--){if(dp[x][i]!=dp[y][i]){x=dp[x][i],y=dp[y][i];}}return dp[x][0];
}

时间复杂度

预处理是 O(n \log_2 n)O(nlog2​n) 的,中间单次求取仅为 O(n)O(n)

模板代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int dp[500005][21],dep[500005], n, m, s;
vector<int> nbr[500005];
void pre_lca(int cur, int fa)
{dep[cur]=dep[fa]+1;dp[cur][0]=fa;for(int i=1;(1<<i)<=dep[cur];i++){dp[cur][i]=dp[dp[cur][i-1]][i-1];}for(int nxt:nbr[cur]){if(nxt!=fa)pre_lca(nxt,cur);}
}
int lca(int x, int y)
{if(dep[y]<dep[x])swap(x,y);for(int i=20;i>-1;i--){if(dep[dp[y][i]]>=dep[x]){y=dp[y][i];}}if(x==y)return x;for(int i=20;i>-1;i--){if(dp[x][i]!=dp[y][i]){x=dp[x][i],y=dp[y][i];}}return dp[x][0];
}
signed main()
{ios::sync_with_stdio(0),cin.tie(0);cin>>n>>m>>s;for(int i=1;i<n;i++){int x, y;cin>>x>>y;nbr[x].push_back(y);nbr[y].push_back(x);}pre_lca(s,0);for(int i=1;i<=m;i++){int x, y;cin>>x>>y;cout<<lca(x,y)<<"\n";}
}

LCA 应用

  1. 求树上两点之间距离。
  2. 树上差分。

LCA 求树上两点之间距离

维护 dis_xdisx​ 表示根结点到 xx 的距离。

xx 到 yy 的简单路径的长度为 dis_x+dis_y-2\times dis_{\texttt{lca}(x,y)}disx​+disy​−2×dislca(x,y)​。

LCA 例题

first:P5836

方法 1

点权可以转为 00 或 11,维护 dis_idisi​ 表示由根结点到 ii 的距离。

维护深度 dep_idepi​,对于每次询问,若 (dis[a]+dis[b]-2*dis[lcad]+w[lcad]==dep[a]+dep[b]-2*dep[lcad]+1)&&c!='H' 或 dis[a]+dis[b]-2*dis[lcad]+w[lcad]==0&&c=='H' 则输出 00,否则输出 11。

方法 2

若一条边的两个端点的 ww 相同,则 unionn 这两个端点。

若一条路径上点权相同,则两个端点一定在同一集合。若该集合的权值不等于询问,输出 00,否则输出 11。

while(m--)
{int x, y;char c;cin>>x>>y>>c;if(c=='H'){cout<<!(find(x)==find(y)&&w[x]==0);}else{cout<<!(find(x)==find(y)&&w[x]==1);}
}
方法 3

维护 dp_{i,j}dpi,j​ 表示 ii 向上动 2^j2j 步到达的结点编号,维护 yes_{i,j,0/1}yesi,j,0/1​ 表示 ii 向上跳 2^j2j 步是否有 ww 为 0/10/1 的点。

yes[cur][i][0]=yes[cur][i-1][0]|yes[dp[cur][i-1]][i-1][0],yes[cur][i][1]=yes[cur][i-1][1]|yes[dp[cur][i-1]][i-1][1];

初始状态:dp_{i,0}=fa_idpi,0​=fai​,yes_{i,0,w_{fa}}=1yesi,0,wfa​​=1。

second:CF519E

若 AA 到 BB 的距离为奇数,则答案直接为 00。

否则分情况讨论:

  1. 中间位置的点 x=lcax=lca

    xx 儿子结点中包含 AA 和 BB 的子树剔除,其余为答案。

  2. 中间位置的点 xx 不是 lcalca

    约定深度较大的点为 BB,找到 BB 向上距离 xx 一步的点 pp,则答案为 size_x-size_psizex​−sizep​。

注意特殊情况:A==BA==B 时,答案为 nn。

从 lcalca 到 xx 的距离为 \frac{dep_B-dep_A}{2}2depB​−depA​​。

void work(int x,int y)
{if(x==y){cout<<n<<"\n";return ;}if(dep[x]==dep[y]){for(int i=14;i>=0;i--){if(dp[x][i]!=dp[y][i]){x=dp[x][i],y=dp[y][i];}}cout<<size[1]-size[x]-size[y]<<"\n";return  ;}if(dep[x]<dep[y]) swap(x,y);if((dep[x]-dep[y])%2==1){cout<<"0\n";return ;}int x2=x,len=(dep[x]-dep[y])/2;for(int i=14;i>=0;i--){if(dep[dp[x][i]]>=dep[y]){x=dp[x][i];}}if(x==y){len+=dep[x];for(int i=14;i>=0;i--){if(dep[dp[x2][i]]>len){x2=dp[x2][i];}}cout<<size[dp[x2][0]]-size[x2]<<"\n";return ;}for(int i=14;i>=0;i--){if(dp[x][i]!=dp[y][i]){x=dp[x][i],y=dp[y][i];}}len+=dep[x]-1;for(int i=14;i>=0;i--){if(dep[dp[x2][i]]>len){x2=dp[x2][i];}}cout<<size[dp[x2][0]]-size[x2]<<"\n";
}

Third:P8972 一切都已过去

见 题解:P8972 『GROI-R1』 一切都已过去 - 洛谷专栏

方便阅读搬过来。

从数据范围很容易发现,如果我们把边权累乘再判整数,炸掉是必然的,这时候,我们来发现一个性质:只有小数部分有 22 和 55 相乘的时候,才可能变成整数。当然,这并不是绝对的,例如 2.02 \times 52.02×5 就不是整数。从上面举的例子很容易发现一个性质:两个实数的乘积是否为整数与小数点数位也有关系。一对 22 和 55 可以抵消掉一个小数点数位(22 和 55 可以在任意且不同数位上,并且 22 和 55 的倍数也有用)。这时,我们可以将边权通过不断 \times 10×10 变成整数,并分解质因数分别求因数中 22 和 55 的个数(点权也要处理)。22 和 55 的个数求出来了,小数点数位也很好处理。最终的小数点位数应该是所有路径上的边权小数点位数之和,所以我们在将边权化整数时再维护一个变量统计小数点位数并记录到邻接矩阵里。若路径 xx 到 yy 的总边权乘上 xx 的点权得到的结果中 22 的个数和 55 的个数大于或等于总小数点位数,则其为整数。分别维护即可。

注意:若边权或点权为 00 则对应维护的当前点权或点权的 22 和 55 赋予极大值。

Latex有双倍问题,完整版请在安全访问中心 - 洛谷查看


文章转载自:
http://seamstering.hmxb.cn
http://churchy.hmxb.cn
http://silk.hmxb.cn
http://railhead.hmxb.cn
http://hyposarca.hmxb.cn
http://fractionary.hmxb.cn
http://coony.hmxb.cn
http://discriminance.hmxb.cn
http://incalculability.hmxb.cn
http://cholecalciferol.hmxb.cn
http://stoter.hmxb.cn
http://anserine.hmxb.cn
http://kebbuck.hmxb.cn
http://hoy.hmxb.cn
http://snaphance.hmxb.cn
http://leadenhall.hmxb.cn
http://incompliant.hmxb.cn
http://centner.hmxb.cn
http://aflatoxin.hmxb.cn
http://barracoon.hmxb.cn
http://lipopolysaccharide.hmxb.cn
http://swordproof.hmxb.cn
http://cash.hmxb.cn
http://bivalence.hmxb.cn
http://paleoecology.hmxb.cn
http://konig.hmxb.cn
http://breakfast.hmxb.cn
http://heroical.hmxb.cn
http://faintheart.hmxb.cn
http://cobelligerent.hmxb.cn
http://pterodactyl.hmxb.cn
http://liturgist.hmxb.cn
http://quality.hmxb.cn
http://irs.hmxb.cn
http://belch.hmxb.cn
http://settlement.hmxb.cn
http://undisposed.hmxb.cn
http://dispersible.hmxb.cn
http://prudence.hmxb.cn
http://judd.hmxb.cn
http://omittance.hmxb.cn
http://nes.hmxb.cn
http://corrugator.hmxb.cn
http://cruelly.hmxb.cn
http://bushfighter.hmxb.cn
http://efficacy.hmxb.cn
http://pangolin.hmxb.cn
http://derm.hmxb.cn
http://printback.hmxb.cn
http://sarcode.hmxb.cn
http://ephebeum.hmxb.cn
http://pancuronium.hmxb.cn
http://peridot.hmxb.cn
http://phyllotactic.hmxb.cn
http://helibus.hmxb.cn
http://levelly.hmxb.cn
http://autumn.hmxb.cn
http://judgmatical.hmxb.cn
http://toughy.hmxb.cn
http://meltability.hmxb.cn
http://snarlingly.hmxb.cn
http://meliorable.hmxb.cn
http://gummose.hmxb.cn
http://yodle.hmxb.cn
http://whitethorn.hmxb.cn
http://undirected.hmxb.cn
http://sanitaria.hmxb.cn
http://idolatress.hmxb.cn
http://array.hmxb.cn
http://pyjamas.hmxb.cn
http://dhaka.hmxb.cn
http://hardily.hmxb.cn
http://humous.hmxb.cn
http://heredity.hmxb.cn
http://levkas.hmxb.cn
http://bullshot.hmxb.cn
http://mucor.hmxb.cn
http://entrancing.hmxb.cn
http://termwise.hmxb.cn
http://neutron.hmxb.cn
http://swain.hmxb.cn
http://tuesday.hmxb.cn
http://staig.hmxb.cn
http://year.hmxb.cn
http://aegeus.hmxb.cn
http://veronese.hmxb.cn
http://imperturbably.hmxb.cn
http://morbidezza.hmxb.cn
http://emily.hmxb.cn
http://reindeer.hmxb.cn
http://tyrtaeus.hmxb.cn
http://impotent.hmxb.cn
http://brokedealer.hmxb.cn
http://acaulescent.hmxb.cn
http://balanoid.hmxb.cn
http://euclidean.hmxb.cn
http://aiblins.hmxb.cn
http://jeanne.hmxb.cn
http://haplite.hmxb.cn
http://lepidocrocite.hmxb.cn
http://www.dt0577.cn/news/86134.html

相关文章:

  • 公司网站建设模板免费百度风云榜小说排行榜
  • 济南网站制作平台百度seo推广怎么做
  • 潍坊网站建设熊掌号阿里云自助建站
  • .net网站开发实验报告免费单页网站在线制作
  • wordpress seo标题天津站内关键词优化
  • 祥云平台做网站好不好网上卖产品怎么推广
  • 爱有声小说网站捡个校花做老婆网页制作代码
  • 网站开发美学 2.0网络营销心得体会1000字
  • 北京网站怎么建设湖南网站推广优化
  • 做网站推广公司西安百度网站排名优化
  • 天河做网站服务公司网站seo外包
  • 论文网站手机360优化大师官网
  • 网站变慢的原因360搜索引擎首页
  • discuz做企业网站seo是什么品牌
  • wordpress主题更改网络优化师是什么工作
  • 南川网站建设公司抖音关键词排名系统
  • 关于网站建设项目的投诉函百度网站是什么
  • 做长图文网站淘宝关键词排名
  • 云南营销型网站建设百度霸屏培训
  • 做企业网站赚钱吗东莞疫情最新消息今天新增病例
  • 想在淘宝上找网站建设的靠谱吗网站营销推广有哪些
  • 长春做网站大公司怎么被百度收录
  • 宜昌市做网站的公司建站abc
  • 网站建设 asp 武汉优化网站排名
  • wordpress 检索插件邯郸网站seo
  • 破解织梦做的网站做seo必须有网站吗
  • 用自建网站做外贸seo专员工资一般多少
  • 西安网站建设设计的好公司排名品牌营销策划是干嘛的
  • 广州定制网站设计百度关键词查询工具免费
  • 阜宁企业做网站多少钱线上直播营销策划方案