A and B and Lecture Rooms

A and B and Lecture Rooms

题意要求我们找有多少个点iii满足dis(i,x),dis(i,y)dis(i, x), dis(i, y)dis(i,x),dis(i,y),输出点iii的数量即可。

首先特判无解的情况就是dis(x,y)dis(x, y)dis(x,y)为奇数时,接下来我们讨论有解的情况,大致分为两类。

首先我们一定可以在x−>yx->yx>y的路径上找到一个点满足要求。

  • 这个点不在lca(x,y)lca(x, y)lca(x,y)上:
    如图我们要找的是(5, 6)的满足要求的点有多少个,lca(5,6)=7lca(5, 6) = 7lca(5,6)=7
    显然3是其路径上的一个满足要求的点,因为5号节点是从3号节点的父亲连过来的,所以3号节点的父节点往上的节点均不满足要求。
    同样的6号节点是在3号节点的某一棵子树上,所以3号节点要舍弃以4号节点为根节点的子树,
    所以这种情况就变成了,sz[3]−sz[4]sz[3] - sz[4]sz[3]sz[4],显然我们可以得到x,yx, yx,y路径上的中点记为uuux,yx, yx,y中深度更大的节点xxx一定在uuu的子树上,所以uuu的某个儿子vvv的子树包含xxx节点要舍弃,
    所以答案就是sz[u]−sz[v]sz[u] - sz[v]sz[u]sz[v]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YLmMFMAx-1606395257524)(https://uploadfiles.nowcoder.com/images/20201126/581797790_1606394709289_80755262A164F6A4561AC17A7C5E4767 "图片标题")]

  • 这个点在lca(x,y)lca(x, y)lca(x,y)
    这个情况比上面就简单了,x,yx, yx,y一定都在lcalcalca的某两个不同的儿子上,
    所以找到包含xxx的儿子uuu,和包含yyy的儿子vvv,然后n−sz[u]−sz[v]n - sz[u] - sz[v]nsz[u]sz[v]即为答案。

最后特判一下x==yx == yx==y的情况即可。

/*Author : lifehappy
*/
#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 10;int head[N], to[N], nex[N], cnt = 1;int fa[N], top[N], son[N], sz[N], dep[N], id[N], rk[N], tot;int n, m;void add(int x, int y) {to[cnt] = y;nex[cnt] = head[x];head[x] = cnt++;
}void dfs1(int rt, int f) {fa[rt] = f, dep[rt] = dep[f] + 1;sz[rt] = 1;for(int i = head[rt]; i; i = nex[i]) {if(to[i] == f) continue;dfs1(to[i], rt);sz[rt] += sz[to[i]];if(!son[rt] || sz[son[rt]] < sz[to[i]]) son[rt] = to[i];}
}void dfs2(int rt, int tp) {top[rt] = tp;rk[++tot] = rt;id[rt] = tot;if(!son[rt]) return ;dfs2(son[rt], tp);for(int i = head[rt]; i; i = nex[i]) {if(to[i] == fa[rt] || to[i] == son[rt]) continue;dfs2(to[i], to[i]);}
}int lca(int x, int y) {while(top[x] != top[y]) {if(dep[top[x]] < dep[top[y]]) swap(x, y);x = fa[top[x]];}return dep[x] < dep[y] ? x : y;
}int dis(int x, int y) {return dep[x] + dep[y] - 2 * dep[lca(x, y)];
}int get_fa(int x, int k) {while(k > id[x] - id[top[x]]) {k -= id[x] - id[top[x]] + 1;x = fa[top[x]];}return rk[id[x] - k];
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);scanf("%d", &n);for(int i = 1; i < n; i++) {int x, y;scanf("%d %d", &x, &y);add(x, y);add(y, x);}dfs1(1, 0);dfs2(1, 1);scanf("%d", &m);for(int i = 1; i <= m; i++) {int x, y;scanf("%d %d", &x, &y);if(x == y) {printf("%d\n", n);continue;}int d = dis(x, y), l = lca(x, y);if(d & 1) {puts("0");continue;}if(dep[x] < dep[y]) swap(x, y);int p = get_fa(x, d / 2);if(p == l) {int u = get_fa(x, d / 2 - 1), v = get_fa(y, d / 2 - 1);printf("%d\n", n - sz[u] - sz[v]);}else {int u = get_fa(x, d / 2 - 1);printf("%d\n", sz[p] - sz[u]);}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

观星(计算几何/凸包/多边形面积)

观星 对于平面上有n个点分为三类&#xff0c;要求寻找一个三角形&#xff0c;三个顶点分别属于这三类&#xff0c;求解最大面积。 N<3000 首先考虑到O(n2)O(n^2)O(n2)的枚举&#xff0c;然后对于另外一种考虑这个点的位置&#xff0c;显然它应该在凸包上&#xff0c;因为我…

DevOps之持续集成SonarQube代码质量扫描

SonarQube是一个用于代码质量检测管理的开放平台&#xff0c;可以集成不同的检测工具&#xff0c;代码分析工具&#xff0c;以及持续集成工具。SonarQube 并不是简单地把不同的代码检查工具结果直接显示在 Web 页面上&#xff0c;而是通过不同的插件对这些结果进行再加工处理&a…

2019-03-12-算法-进化(合并两个有序数组)

题目描述 给定两个有序整数数组 nums1 和 nums2&#xff0c;将 nums2 合并到 nums1 中&#xff0c;使得 num1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n你可以假设 nums1 有足够的空间&#xff08;空间大小大于或等于 m n&#xff09;来保存…

网络流与线性规划24题(写了一半,先鸽下了……)

Network-flows Ford-Fulkerson算法 typedef long long ll;const int N 1e5 10;int head[N], to[N], nex[N], flow[N], cnt;int vis[N], n, m, s, t;void add(int x, int y, int w) {to[cnt] y;nex[cnt] head[x];flow[cnt] w;head[x] cnt; }ll dfs(int rt, ll now) {if(…

数字(进制/二分/组合数学)

数字 求解满足从n1到2n中有恰好m个数字含有k个1的n&#xff0c;并求出个数 首先看到二进制的问题&#xff0c;我们需要寻找性质&#xff0c;首先考虑n1和2n的性质&#xff0c;然后这道题中我们设f(n,k)表示n1到2n中的数字含k个1的个数。 然后考虑f(n1,k)f(n,k)[2n1含k个1]&am…

.NET CORE 怎么样从控制台中读取输入流

从Console.ReadList/Read 的源码中&#xff0c;可学习到.NET CORE 是怎么样来读取输入流。也可以学习到是如何使用P/Invoke来调用系统APIConsole.ReadList 的源码为[MethodImplAttribute(MethodImplOptions.NoInlining)]public static string ReadLine(){return In.ReadLine();…

变量(网络流模型)

变量 首先最终答案的形式一定是每个变量前面对应一个系数&#xff0c;然后加上一些绝对值&#xff0c;由于每个变量只有两种取法&#xff0c;所以我们考虑使用最小割处理&#xff0c;对于每个变量建一个点分别连到S和T&#xff0c;然后表示选择取哪个&#xff0c;然后会有一边是…

使用VS Code 开发.NET CORE 程序指南

1. 前言近两年来&#xff0c;很多前端的同学都开始将 VSCode 作为前端主力开发工具&#xff0c;其丰富的扩展给程序开发尤其是前端开发带来了很多便利&#xff0c;但是作为微软主力语言的 .NET&#xff0c;却由于有宇宙第一IDE Visual Studio存在&#xff0c;很少有看到有后端同…

珂朵莉树

珂朵莉树 简要 珂朵莉树的核心操作&#xff1a;split 实际很简单&#xff0c;一个集合中&#xff0c;有一部分需要修改&#xff0c;而另一部分不需要修改&#xff0c;就把集合拆开&#xff0c;拆成两部分。 珂朵莉树的推平操作&#xff1a;assign 珂朵莉树的复杂度是由ass…

2019-03-13-算法-进化(鸡蛋掉落)

题目描述 你将获得 K 个鸡蛋&#xff0c;并可以使用一栋从 1 到 N 共有 N 层楼的建筑。 每个蛋的功能都是一样的&#xff0c;如果一个蛋碎了&#xff0c;你就不能再把它掉下去。 你知道存在楼层 F &#xff0c;满足 0 < F < N 任何从高于 F 的楼层落下的鸡蛋都会碎&…

P3810 【模板】三维偏序(陌上花开)

P3810 【模板】三维偏序&#xff08;陌上花开&#xff09; cdq分治的模板题目&#xff0c;用cdq分治处理点对的问题&#xff0c;首先按照第一维排序&#xff0c;然后分治&#xff0c;这样就可以每次考虑二三维即可&#xff0c;然后就可以利用树状数组求解了&#xff0c;然后一…

用pythonnet为计算机视觉做图像整理

中国的.NETer是国内技术的另类&#xff0c;当他们强调.NET也可以做啥啥时都会给别的技术藐视&#xff0c;毕竟主流都不用.NET。本人这几年其实花在.NET时间也少&#xff0c;都投入在Python/Go社区。可我还是有点工作外的寄托&#xff0c;就是让.NET也有一个很好的推广&#xff…

ABP虚拟文件系统(VirtualFileSystem)实例------定制菜单栏显示用户姓名

ABP默认的MVC启动模板在登录后, 右上角显示的是用户名:如果想让它显示用户的姓名该如何做呢?这就需要用到ABP一个非常强大的功能------虚拟文件系统.前期准备使用ABP CLI创建一个名为AbpStudy的ASP.NET MVC项目:abp new AbpStudy关于MVC的启动模板可以看文档, 这里就不赘述.虚…

序列计数(动态规划/自动机/前缀和优化)

序列计数 对于一个小写字母的序列每次可以将相邻两个不同的小写字母都变为二者之一&#xff0c;可以进行无限次这样的操作&#xff0c;求解可以产生多少种不同的序列。 首先我们不能考虑操作&#xff0c;而是考虑合法序列&#xff0c;显然最后会形成若干个区间&#xff0c;然…

概率期望dp

概率期望 LOOPS dp[i][j]dp[i][j]dp[i][j]表示从i,ji, ji,j到r,cr, cr,c的期望&#xff0c;有dp[i][j]p0dp[i][j]p1dp[i][j1]p2dp[i1][j]2dp[i][j] p_0 \times dp[i][j] p_1 \times dp[i][j 1] p_2 \times dp[i 1][j] 2dp[i][j]p0​dp[i][j]p1​dp[i][j1]p2​dp[i1][j]2…

2019-03-13-算法-进化(验证回文串)

题目描述 给定一个字符串&#xff0c;验证它是否是回文串&#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。 说明&#xff1a;本题中&#xff0c;我们将空字符串定义为有效的回文串。 示例 1: 输入: "A man, a plan, a canal: Panama" 输出: t…

.NET中国峰会 参与意愿调查

2014年微软组织成立.NET基金会&#xff0c;微软在成为主要的开源参与者的道路上又前进了一步。2014年以来已经有众多知名公司加入.NET基金会, 仅在平台项目中&#xff0c;.NET平台上有87&#xff05;贡献者其实不在Microsoft工作。将.NET基金会变成一个更加多样化和成员驱动的组…

2019-03-14-算法-进化(两个数组的交集 II)

题目描述 给定两个数组&#xff0c;编写一个函数来计算它们的交集。 示例 1: 输入: nums1 [1,2,2,1], nums2 [2,2] 输出: [2,2]示例 2: 输入: nums1 [4,9,5], nums2 [9,4,9,8,4] 输出: [4,9]说明&#xff1a; 输出结果中每个元素出现的次数&#xff0c;应与元素在两个数…

方案计数(带修计数题/线段树)

方案计数 对于一个n个队员&#xff0c;每个队员有一个权值Vi&#xff0c;然后每次选择三个权值相同的A类队员&#xff0c;两个权值小于A类的B类队员&#xff0c;并且B类队员要在A类队员两侧。 Q次操作&#xff0c;每次限制或解除限制一个队员成为A类队员。 首先枚举中间的A类…

线性基专题

线性基 P3812 【模板】线性基 #include <bits/stdc.h>using namespace std;typedef long long ll;struct linearbasis {ll base[64], flag, cnt;void add(ll x) {for(int i 62; ~i; i--) {if(x >> i & 1) {if(!base[i]) {base[i] x;return ;}x ^ base[i];}…