日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ1787 [Ahoi2008]Meet 紧急集合 LCA

發(fā)布時間:2023/12/9 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ1787 [Ahoi2008]Meet 紧急集合 LCA 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

歡迎訪問~原文出處——博客園-zhouzhendong

去博客園看該題解


題目傳送門 - BZOJ1787


題意概括

  有一棵節(jié)點(diǎn)為n個(n≤500000)的樹。接下來m次詢問(m≤500000),每次給出3個點(diǎn) a,b,c ,現(xiàn)在讓你求一個點(diǎn) p ,使得 dis(p,a) + dis(p,b) + dis(p,c) 最小。

  輸出 p 和?dis(p,a) + dis(p,b) + dis(p,c)。


?

題解

  分別求3個LCA。

  學(xué)習(xí)LCA ?-> 傳送門

  有兩個一樣的,那么另外一個就是答案。


?

代碼

#pragma comment(linker,"/STACK:1024000000,1024000000") #include <cstring> #include <algorithm> #include <cstdio> #include <cmath> #include <cstdlib> using namespace std; const int N=500000+5,M=N*2; struct Gragh{int cnt,y[M],nxt[M],fst[N];void set(){cnt=0;memset(fst,0,sizeof fst);}void add(int a,int b){y[++cnt]=b,nxt[cnt]=fst[a],fst[a]=cnt;} }g; int n,m,depth[N],anst[N][20]; void dfs(int prep,int rt){depth[rt]=depth[anst[rt][0]=prep]+1;for (int i=1;i<20;i++)anst[rt][i]=anst[anst[rt][i-1]][i-1];for (int i=g.fst[rt];i;i=g.nxt[i])if (g.y[i]!=prep)dfs(rt,g.y[i]); } int LCA(int a,int b){if (depth[a]>depth[b])swap(a,b);for (int j=depth[b]-depth[a],i=0;j>0;j>>=1,i++)if (j&1)b=anst[b][i];if (a==b)return a;for (int i=19;i>=0;i--)if (anst[a][i]!=anst[b][i])a=anst[a][i],b=anst[b][i];return anst[a][0]; } int main(){scanf("%d%d",&n,&m);g.set();for (int i=1,a,b;i<n;i++){scanf("%d%d",&a,&b);g.add(a,b);g.add(b,a);}depth[0]=-1;memset(anst,0,sizeof anst);dfs(0,1);for (int i=1,a,b,c,ans,pos;i<=m;i++){scanf("%d%d%d",&a,&b,&c);int p1=LCA(a,b),p2=LCA(a,c),p3=LCA(b,c);if (p1==p2)pos=p3;else if (p1==p3)pos=p2;elsepos=p1;int q1=LCA(pos,a),q2=LCA(pos,b),q3=LCA(pos,c);ans=depth[a]+depth[b]+depth[c]+depth[pos]*3-depth[q1]*2-depth[q2]*2-depth[q3]*2;printf("%d %d\n",pos,ans);}return 0; }

  

轉(zhuǎn)載于:https://www.cnblogs.com/zhouzhendong/p/BZOJ1787.html

總結(jié)

以上是生活随笔為你收集整理的BZOJ1787 [Ahoi2008]Meet 紧急集合 LCA的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。