平日里最喜欢做的事就是蒸发学水。
【题目描述】
小 X 所在的城市 X 城是一个含有 N 个节点的无向图,同时,由于 X 国是一
个发展中国家,为了节约城市建设的经费,X 国首相在建造 X 城时只建造 N – 1
条边,使得城市的各个地点能够相互到达。
小 X 计划蒸发 Q 天的学水,每一天会有一名学水从 A 地走到 B 地,并在沿
途各个地点留下一个水塘。此后,小 X 会从 C 地走到 B 地,并用佛光蒸发沿途
的水塘。由于 X 城是一个学佛横行的城市,学水留下的水塘即使没有被小 X 蒸
发,也会在第二天之前被其他学佛蒸发殆尽。
现在,小 X 想要知道,他每一天能够蒸发多少水塘呢?
【输入格式】
从文件 light.in 中读取数据。
第一行三个整数 N、Q、NUM,分别表示 X 城地点的个数,小 X 蒸发学水的
天数,以及测试点编号。注意,测试点编号是为了让选手们更方便的获得部分分,
你可能不需要用到这则信息,在下发的样例中,测试点编号的含义是该样例满足
某一测试点限制。
N – 1 行,每行两个整数 X、Y,表示 X 地与 Y 地之间有一条边。
接下来 Q 行,每行三个整数 A、B、C,表示一天中,有一名学水从 A 地走到
B 地,而小 X 会从 C 地走到 B 地。
【输出格式】
输出 Q 行,每行一个整数,表示小 X 能够蒸发的水塘数。
【样例 1 输入】
3 3 1
1 2
2 3
1 2 3

1 1 3

3 1 3

【样例 1 输出】
1

1

3

分析:这道题的本质就是要求树上同一个点为起点到两个端点的路径交,暴力的复杂度是O(nq)的,可以过50%的点,因为涉及到路径,如果用树链剖分可以过16个点,不过不能用memset,要用时间戳。正解非常巧妙,其实对于树上的任意三点只有可能是两种情况:一条链或者以某个点为中心.

显然对于第二种情况,我们只需要求出中心到B点的距离就好了,如果是一条链我们该怎么做呢?这个时候我们可以把中心定义为深度为中位数的那个点,结合两个中心的定义,我们可以脑补出怎么求中心:ABC三个点两两求LCA,其中深度最大的LCA就是中心,最后求一下中心到B点的距离就好了。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue> using namespace std; const int maxn = ; int n, q, num,head[maxn],to[maxn * ],nextt[maxn * ],tot = ,dist[maxn],fa[maxn][]; void add(int x, int y)
{
to[tot] = y;
nextt[tot] = head[x];
head[x] = tot++;
} void dfs(int u, int from, int d)
{
dist[u] = d;
for (int i = head[u];i;i = nextt[i])
{
int v = to[i];
if (v != from)
{
fa[v][] = u;
dfs(v, u, d + );
}
}
} int lca(int x, int y)
{
if (x == y)
return x;
if (dist[x] < dist[y])
swap(x, y);
for (int i = ;i >= ; i--)
if (dist[fa[x][i]] >= dist[y])
x = fa[x][i];
if (x == y)
return x;
for (int i = ; i >= ; i--)
if (fa[x][i] != fa[y][i])
{
x = fa[x][i];
y = fa[y][i];
}
return fa[x][];
} int main()
{
scanf("%d%d%d", &n, &q, &num);
for (int i = ; i < n; i++)
{
int x, y;
scanf("%d%d", &x, &y);
add(x, y);
add(y, x);
}
dfs(, , );
for (int j = ; j <= ; j++)
for (int i = ; i <= n;i++)
fa[i][j] = fa[fa[i][j - ]][j - ];
while (q--)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
int d = lca(a, b), e = lca(b, c), f = lca(a, c);
if (dist[d] < dist[e])
swap(d, e);
if (dist[d] < dist[f])
swap(d, f);
printf("%d\n", dist[d] + dist[b] - * dist[lca(d, b)] + );
} return ;
}

常州模拟赛d2t3 小X的佛光的更多相关文章

  1. 常州模拟赛d2t2 小X的密室

    题目描述 密室中有 N 个房间,初始时,小 X 在 1 号房间,而出口在 N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会 单向地 创造一条从房间 X 到房间 Y 的通道.另 ...

  2. 常州模拟赛d2t1 小X的质数

    题目背景 小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的 情感.小 X 认为,质数是一切自然数起源的地方. 题目描述 在小 X 的认知里,质数是除了本身和 1 以外,没有其他因 ...

  3. 2014.7.7 模拟赛【小K的农场】

    3.小K的农场(farm.pas/cpp/c) [题目描述] 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三 ...

  4. 【20170920校内模拟赛】小Z爱学习

    所有题目开启-O2优化,开大栈空间,评测机效率为4亿左右. T1 小 Z 学数学(math) Description ​ 要说小 Z 最不擅长的学科,那一定就是数学了.这不,他最近正在学习加法运算.老 ...

  5. 常州模拟赛d4t3 字符串划分

    题目描述 给你一串由小写字母组成的字符串,希望你把它划分成一些小段,使得每一小段字符串中的字母 都不相同,并且希望分的段数尽量少. 然后,把这些小段按字典序排序后输出,中间由一个空格分隔. 例如:字符 ...

  6. 常州模拟赛d4t1 立方体

    题目描述 立方体有 6 个面,每个面上有一只奶牛,每只奶牛都有一些干草.为了训练奶牛的合作精神,它 们在玩一个游戏,每轮:所有奶牛将自己的干草分成 4 等份,分给相邻的 4 个面上的奶牛. 游戏开始, ...

  7. 常州模拟赛d3t3 两只怪物心心相印

    题目背景 从前我是一位无名的旅人,旅途中我得到了某样东西:贤者之石.我因此得到悠久的时光和漂泊的生命.1897年冬天,我一时兴起舍弃了旅人的生活. 贤者之石创造出来的,是货真价实的黄金.我的名声传遍了 ...

  8. 常州模拟赛d3t1 神在夏至祭降下了神谕

    题目描述 我们村子在过去的400年中,断绝与下界的接触,过着自给自足的生活. 夏至祭是一场迎接祖灵于夏季归来,同时祈求丰收的庆典. 村里的男人会在广场上演出夏之军和冬之军的战争.夏之军会打倒冬之军的大 ...

  9. 常州模拟赛d7t2 数组

    题目背景 HJZ 有很多玩具.他最喜欢玩的玩具是一个可以变化的数组. 题目描述 HJZ 的数组初始时有 n 个元素.他可以把一个位置上的数加上或减去一个固定的 数 x. 一天 LJZ 和 HZY 来 ...

随机推荐

  1. UVA 11324 The Largest Clique (强连通分量,dp)

    给出一个有向图,求一个最大的结点集合,任意两个点u,v.u可到达v或v可到达u. 一个强连通分量肯定一起选的.而且只能在一条路径上. 所以先找出所有scc,然后缩点找一条最大权的路径,按拓扑序跑DAG ...

  2. Bootstrap历练实例:小的按钮

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...

  3. shell脚本,通过传入的参数来计算最大值和最小值以及平均值。

    [root@localhost zuoye]# cat quansges.sh #!/bin/bash > file [ ! $# -ge ] && || echo $* > ...

  4. java在线聊天项目 swt可视化窗口Design 登录框注册按钮点击改变窗口大小——出现注册面板 实现打开登录框时屏幕居中

    登录框注册按钮点击改变窗口大小——出现注册面板  首先用swt可视化设计登录窗口如下图: 此时窗口高度为578 没点击注册时高度为301(可自己定) 注意:注册用户的Jpanel 的border选择T ...

  5. CS193p Lecture 9 - Animation, Autolayout

    Animation(动画) Demo Dropit续 Autolayout(自动布局) 三种添加自动布局的方法: 使用蓝色辅助虚线,右键选择建议约束(Reset to Suggested Constr ...

  6. Gentoo更新portage记录

    小记一下这两天更新服务器版本遇到的各种问题. 服务器系统: Gentoo 第一天 其实本来不打算更新系统的,因为最近想试试免费的SSL证书,于是自然而然搜到了letsencrypt,跟着他们的流程需要 ...

  7. 628. Maximum Product of Three Numbers@python

    Given an integer array, find three numbers whose product is maximum and output the maximum product. ...

  8. Watch Before You Feel Pressure

    Today's assembly is about the start of a journey. 今天的大会是一个旅程的开始. The start of the rest of your lives ...

  9. (50)zabbix API二次开发使用与介绍

    zabbix API开发库 zabbix API请求和响应都是json,并且还提供了各种语法的lib库,http://zabbix.org/wiki/Docs/api/libraries,包含php. ...

  10. laravel中文字模型的增删改查

    模型是用ORM 来做, 使用类来表示一个表,每个表都对应一个模型,以供上层使用 创建模型在项目中的位置定位: /app/下面 好了,我们来创建一个模型: php artisan make:model ...