<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      luogu 模板:https://www.luogu.com.cn/problem/P3379

      樹剖求 \(LCA\)
      時間復雜度 \(O(2n + qlogn)\)

      #include<bits/stdc++.h>
      using namespace std;
      using LL = long long;
      struct HLD{
      	vector<vector<int>> e;
      	vector<int> top, dep, parent, siz, son;
      	HLD(int n){
      		e.resize(n + 1);
      		top.resize(n + 1);
      		dep.resize(n + 1);
      		parent.resize(n + 1);
      		siz.resize(n + 1);
      		son.resize(n + 1);
      	}
      	void add(int u, int v){
      		e[u].push_back(v);
      		e[v].push_back(u);
      	}
      	void dfs1(int u){
      		siz[u] = 1;
      		dep[u] = dep[parent[u]] + 1;
      		for (auto v : e[u]){
      			if (v == parent[u]) continue;
      			parent[v] = u;
      			dfs1(v);
      			siz[u] += siz[v];
      			if (siz[v] > siz[son[u]]) son[u] = v;
      		}
      	}
      	void dfs2(int u, int up){
      		top[u] = up;
      		if (son[u]) dfs2(son[u], up);
      		for (auto v : e[u]){
      			if (v == parent[u] || v == son[u]) continue;
      			dfs2(v, v);
      		}
      	}
      	int lca(int u, int v){
      		while (top[u] != top[v]){
      			if (dep[top[u]] > dep[top[v]]){
      				u = parent[top[u]];
      			}
      			else{
      				v = parent[top[v]];
      			}
      		}
      		return dep[u] < dep[v] ? u : v;
      	}
      };
      int main(){
      	ios::sync_with_stdio(false);cin.tie(0);
      	int n, m, s;
      	cin >> n >> m >> s;
      	HLD t(n);
      	for (int i = 0; i < n - 1; i ++ ){
      		int u, v;
      		cin >> u >> v;
      		t.add(u, v);
      	}
      	t.dfs1(s);
      	t.dfs2(s, s);
      	for (int i = 0; i < m; i ++ ){
      		int u, v;
      		cin >> u >> v;
      		cout << t.lca(u, v) << "\n";
      	}
      	return 0;
      }
      

      倍增求 \(LCA\)
      時間復雜度 預處理時間:\(O(nlogn)\)

      #include <bits/stdc++.h>
      using namespace std;
      const int N = 5e5 + 10;
      int n, m, root, d[N], p[N][30], lg[N];
      vector <int> g[N];
      void dfs(int u, int fa){
      	p[u][0] = fa;
      	d[u] = d[fa] + 1;
      	for (int i = 1; i <= lg[d[u]]; i ++ )
      		p[u][i] = p[p[u][i - 1]][i - 1];
      		// u 的 2^i 的祖先等于 u 的 2^(i-1) 的祖先的 2^(i-1) 的祖先
      	for (auto v : g[u])
      		if (v != fa)
      			dfs(v, u);
      }
      int lca(int x, int y){
      	if(d[x] < d[y]) swap(x, y);
      	while (d[x] > d[y])
      		x = p[x][lg[d[x] - d[y]] - 1];
      	if (x == y) return x;
      	for (int k = lg[d[x]] - 1; k >= 0; k -- )
      		if (p[x][k] != p[y][k]){
      			x = p[x][k];
      			y = p[y][k];
      		}
      	return p[x][0];
      }
      int main(){
      	ios::sync_with_stdio(false);cin.tie(0);
      	cin >> n >> m >> root;
      	for (int i = 1; i < n; i ++ ){
      		int u, v;
      		cin >> u >> v;
      		g[u].push_back(v);
      		g[v].push_back(u);
      	}
      	for (int i = 1; i <= n; i ++ )	//預處理 log
      		lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
      	dfs(root, 0);	//找到每個點的祖先 
      	for (int i = 1; i <= m; i ++ ){
      		int x, y;
      		cin >> x >> y;
      		cout << lca(x, y) << "\n";
      	}
      	return 0;
      }
      
      posted on 2022-04-25 19:23  Hamine  閱讀(79)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 久久久无码精品国产一区| 日韩精品中文字幕有码| 国产在线精品一区二区三区不卡| 日韩福利视频导航| 亚洲一久久久久久久久| 草草浮力影院| 人人妻人人澡人人爽| 玉林市| 天天躁夜夜躁天干天干2020| 亚洲欧美成人久久综合中文网 | 国产一区二区三区AV在线无码观看| 成人看的污污超级黄网站免费 | 国产综合视频一区二区三区| 青青草国产精品日韩欧美| 保山市| 国产综合色在线精品| 亚洲国产午夜精品理论片| 中文字幕有码无码AV| 99久久精品国产熟女拳交| 精品日韩亚洲av无码| 东京热大乱系列无码| 综艺| 亚洲欧美牲交| JIZZJIZZ国产| 久久久天堂国产精品女人| 国产欧美另类精品久久久| 亚洲精品喷潮一区二区三区| 中文字幕亚洲综合第一页| 亚洲国产精品日韩在线| 18禁超污无遮挡无码网址| 久久婷婷成人综合色| 精品无码人妻| 激情综合色区网激情五月| 国产国拍亚洲精品永久软件| 在线观看中文字幕码国产| 精品久久久久久久中文字幕| 国产精品国产三级国av| 亚洲成人av在线系列| 人人妻人人狠人人爽天天综合网| 人妻少妇| 亚洲人成人无码网WWW电影首页|