【Lca 倍增】codeforces 832D Misha, Grisha and Underground
Link:http://codeforces.com/problemset/problem/832/D
/*
codeforces 832D
題意:每天 從a b c 三點選擇s f t,使s到f和t到f 經過的公共點個數最多。求每天的經過公共點最多個數。
題解:其實就是求a b c都能到的交叉路口,到abc最長的距離。abc的交叉路口可以是lca(a,b),lca(b,c),lca(a,c)
但是最長的距離肯定是在深度最深的lca。
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5+5;
vector<int> ma[N];
int pa[N][20],d[N];
const int POW = 18; //2^17 > 100000
void dfs(int u,int fa)
{
d[u] = d[fa]+1;
// printf("%d %d\n",u,d[u]);
pa[u][0] = fa;
for(int i = 1; i < POW; i++)
pa[u][i] = pa[pa[u][i-1]][i-1];
for(int i = 0; i < ma[u].size(); i++)
{
int v = ma[u][i];
if(v==fa) continue;
dfs(v,u);
}
}
int lca(int a, int b)
{
if(d[a] > d[b]){
int temp = a;
a = b;
b = temp;
//a ^= b, b ^= a, a ^= b;
}
if(d[a] < d[b]){
int del = d[b] - d[a];
for(int i = 0; i < POW; i++)
if(del&(1<<i))
b = pa[b][i];
}
if(a != b)
{
for(int i = POW-1; i >= 0; i--)
if(pa[a][i] != pa[b][i])
a = pa[a][i] , b = pa[b][i];
a = pa[a][0];
}
return a;
}
int dist(int a,int b){
return d[a]+d[b]-2*(d[lca(a,b)]);
}
int main()
{
memset(d,0,sizeof(d));
int n,q;
scanf("%d%d",&n,&q);
for(int i = 2; i <= n; i++)
{
int a;
scanf("%d",&a);
ma[i].push_back(a);
ma[a].push_back(i);
}
dfs(1,0);
for(int i = 0; i < q; i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
int ans1 = lca(a,b);
int ans2 = lca(b,c);
int ans3 = lca(a,c);
if(d[ans1] < d[ans2]) ans1 = ans2;
if(d[ans1] < d[ans3]) ans1 = ans3;
printf("%d\n",max(dist(ans1,a),max(dist(ans1,b),dist(ans1,c)))+1);
}
return 0;
}
相關文章
- LCA + 樹上倍增
- LCA(倍增與Tarjan)
- 淺談倍增法求解LCA
- Codeforces/gym/100685/problem/G Gadget Hackwrench ( LCA )
- lca
- 倍增
- 求 LCA
- CF504E Misha and LCP on Tree
- RMQ求lcaMQ
- 基本技巧——倍增
- DFN 序求 LCA
- ybtoj——倍增問題
- LCA學習筆記筆記
- 樹上公共祖先(LCA)
- Lca相關演算法演算法
- 廣告效果倍增的17條指南
- 等比數列求和技巧(公式+倍增)公式
- 資料蔣堂|倍增分段技術
- 資料蔣堂 | 倍增分段技術
- 貨車運輸(LCA+最大生成樹)
- POJ1330 Nearest Common Ancestors【LCA】REST
- ZeptoLab CEO Misha Lyalin談遊戲定義和產品探尋方向遊戲
- 如何利用資料探勘讓RTB廣告效果倍增?
- 【Lca 線上st演算法】hdu 2586 How far away ?演算法
- 15年我國網路安全事件翻倍增長事件
- 花旗:Facebook有五增收利器 營收或翻倍增長營收
- Codeforces
- 演算法學習筆記(5): 最近公共祖先(LCA)演算法筆記
- 【Lca 離線Tarjan演算法】hdu 2586 How far away ?演算法
- 淺析雲端儲存的TCS和LCA兩大架構架構
- 樹上問題/簡單演算法 LCA【最近公共祖先】演算法
- LCA Online Query with O(N) Memory and O(1) Time Complexity
- codeforces Mafia
- codeforces Winner
- 鐳速雲傳讓您的外貿工作效率倍增
- 生產力倍增器 iPad Pro效率翻倍的秘密iPad
- Windows Mobile 6今年出貨1千萬 明年成倍增長Windows
- codeforces Educational Codeforces Round 33 (Rated for Div. 2)