当前位置:网站首页>P4281 [AHOI2008]紧急集合 / 聚会(LCA)
P4281 [AHOI2008]紧急集合 / 聚会(LCA)
2022-07-05 00:02:00 【eva_can(not)survive】
[AHOI2008]紧急集合 / 聚会 - 洛谷https://www.luogu.com.cn/problem/P4281这题很明显要用LCA写,求3个点两两LCA然后判断,如果这3个LCA相等那么他们就在该点汇合,若有一个不一样则,在那个不一样的汇合,不可能出现三个都不一样的情况。
正确性画个图就可以判断出来。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <cstring>
#include <set>
#include <cmath>
#include <map>
#include <bitset>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int MN = 65005;
const int MAXN = 1e6 + 10;
const int INF = 0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false)
#define lowbit(x) ((x)&(-x))
using P = pair<int, int>;
int n, m;
int head[MAXN];
int nxt[MAXN];
int ver[MAXN];
int cnt;
int dep[MAXN];
int LOG2[MAXN];
int fafa[MAXN][20];
void add(int x, int y) {
ver[++cnt] = y;
nxt[cnt] = head[x];
head[x] = cnt;
}
void dfs(int p, int fa) {
fafa[p][0] = fa;
for (int i = 1; i <= LOG2[dep[p]]; i++) {
fafa[p][i] = fafa[fafa[p][i - 1]][i - 1];
}
for (int i = head[p]; i; i = nxt[i]) {
int v = ver[i];
if (v == fa)
continue;
dep[v] = dep[p] + 1;
dfs(v, p);
}
}
int lca(int x, int y) {
if (dep[x] < dep[y])
swap(x, y);
while (dep[x] != dep[y]) {
x = fafa[x][LOG2[dep[x] - dep[y]]];
}
if (x == y)
return x;
for (int i = LOG2[dep[x]]; i >= 0; i--) {
if (fafa[x][i] != fafa[y][i])
x = fafa[x][i], y = fafa[y][i];
}
return fafa[x][0];
}
void solve() {
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
int tmp1 = lca(x, y);
int tmp2 = lca(y, z);
int tmp3 = lca(x, z);
// printf("====%d %d %d\n", tmp1, tmp2, tmp3);
if (tmp1 == tmp2 && tmp1 == tmp3 && tmp2 == tmp3) {
printf("%d %d\n", tmp1, dep[x] + dep[y] + dep[z] - 3 * dep[tmp1]);
} else if (tmp1 == tmp2 && tmp1 != tmp3) {
printf("%d %d\n", tmp3, dep[x] + dep[z] - 2 * dep[tmp3] + dep[tmp3] + dep[y] - 2 * dep[tmp1]);
} else if (tmp1 == tmp3 && tmp1 != tmp2) {
printf("%d %d\n", tmp2, dep[y] + dep[z] - 2 * dep[tmp2] + dep[tmp2] + dep[x] - 2 * dep[tmp1]);
} else if (tmp2 == tmp3 && tmp1 != tmp2) {
printf("%d %d\n", tmp1, dep[x] + dep[y] - 2 * dep[tmp1] + dep[tmp1] + dep[z] - 2 * dep[tmp2]);
}
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 2; i <= n; i++) {
LOG2[i] = LOG2[i / 2] + 1;
}
dep[1] = 0;
int x, y;
for (int i = 1; i <= n - 1; i++) {
scanf("%d %d", &x, &y);
add(x, y);
add(y, x);
}
dfs(1, 0);
while (m--)
solve();
return 0;
}
边栏推荐
- 人生无常,大肠包小肠, 这次真的可以回家看媳妇去了。。。
- [IELTS reading] Wang Xiwei reading P4 (matching1)
- Summary of week 22-07-02
- 【雅思阅读】王希伟阅读P4(matching1)
- Why does infographic help your SEO
- How many triangles are there in the golden K-line diagram?
- 香港珠宝大亨,22亿“抄底”佐丹奴
- 微服务(Microservice)那点事儿
- PaddleOCR教程
- Life is changeable, and the large intestine covers the small intestine. This time, I can really go home to see my daughter-in-law...
猜你喜欢
随机推荐
[paper reading] cavemix: a simple data augmentation method for brain vision segmentation
企业应用业务场景,功能添加和修改C#源码
Mit-6.824-lab4b-2022 (10000 word idea explanation - code construction)
MP advanced operation: time operation, SQL, querywapper, lambdaquerywapper (condition constructor) quick filter enumeration class
Nine Qi single chip microcomputer ny8b062d single key control four LED States
[JS] - [sort related] - Notes
How to reduce the stock account Commission and stock speculation commission? Is it safe to open an online account
Skills in analyzing the trend chart of London Silver
Using the uniapp rich text editor
What is the difference between port mapping and port forwarding
Consolidated expression C case simple variable operation
微软禁用IE浏览器后,打开IE浏览器闪退解决办法
Significance of acrel EMS integrated energy efficiency platform in campus construction
Fast analysis -- easy to use intranet security software
Power operation and maintenance cloud platform: open the new mode of "unattended and few people on duty" of power system
Application of fire fighting system based on 3D GIS platform
电力运维云平台:开启电力系统“无人值班、少人值守”新模式
45岁教授,她投出2个超级独角兽
Continuous modification of business scenario functions
多回路仪表在基站“转改直”方面的应用