hdu 5156 離線的最近公共祖先 手寫讀入

2021-06-28 09:56:14 字數 1221 閱讀 3323

這道題就是標記每個點對其所在子樹的顏色增加的貢獻值,如果u和v顏色相同,那麼其中乙個在此公共祖先l到根的路徑貢獻要-1,所以在l處先減去1,相當於拋棄這一對點中前乙個點對顏色數增加的貢獻,再用第二個和後面的取最近公共祖先,依次類推.最終再將將子節點的顏色數加在一起即可(重複已經事先減去),可以看做當下每個節點都能貢獻1

#include #include #include #include #include #define maxn 100007

#define max 1500007

using namespace std;

int fa[maxn];

int find ( int x )

struct

e[2][max];

void scan ( int&x )

}int cc = 0;

int head[2][maxn];

int num[maxn];

vectora[maxn];

vectorb[max];

void add ( int flag , int u , int v )

void lca ( int u = 1 , int p = -1 )

for ( int i = head[1][u] ; i != -1 ; i = e[1][i].next )

}void dfs ( int u = 1 , int p = -1 )

} void calc ( int u = 1 , int p = 0 )

num[p] += num[u];

}int n,m;

int main ( )

cc = 0;

int up = 0;

for ( int i = 0 ; i < m ; i++ )

dfs ( );

for ( int i = 1 ; i <= up ; i++ )

b[i].clear(); }}

lca ( );

calc ( );

for ( int i = 1 ; i <= n ; i++ ) a[i].clear();

printf ( "%d" , num[1] );

for ( int i = 2 ; i <= n ; i++ )

printf ( " %d" , num[i] );

printf ( "\n" );

}}

LeetCode 236 二叉樹的最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。說明 所有節點的值都是唯一的。p q 為不同節點且均存在於給定的二叉樹中。個人思路在於先求出root到兩個節點的路徑上所需要路過的節點,分別用vecleft和vecright來儲存,然後再找出兩個陣列中第乙個相同值,如下 definition f...

Leetcode 236 二叉樹的最近公共祖先

例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 示例 1 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1 輸出 3 解釋 節點 5 和節點 1 的最近公共祖先是節點 3。示例 2 輸入 root 3,5,1,6,2,0,...

LeetCode 236 二叉樹的最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 示例 1 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1輸出 3解釋 節點5和節點1的最近公共祖先是節點3。示例 2 ...