luogu P5002 专心OI - 找祖先
题目描述
这个游戏会给出你一棵树,这棵树有NN个节点,根结点是RR,系统会选中MM个点P_1,P_2...P_MP
1
,P
2
...P
M
,要Imakf回答有多少组点对(u_i,v_i)(u
i
,v
i
)的最近公共祖先是P_iP
i
。Imakf是个小蒟蒻,他就算学了LCA也做不出,于是只好求助您了。
Imakf毕竟学过一点OI,所以他允许您把答案模 (10^9+7)(10
9
+7)
输入格式
第一行 N , R , MN,R,M
此后N-1N−1行 每行两个数a,ba,b 表示a,ba,b之间有一条边
此后11行 MM个数 表示P_iP
i
输出格式
MM行,每行一个数,第ii行的数表示有多少组点对(u_i,v_i)(u
i
,v
i
)的最近公共祖先是P_iP
i
容斥原理
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e4+10,M=2*N,mod=1e9+7;
int next[M],head[N],go[M],tot;
inline void add(int u,int v){
next[++tot]=head[u];head[u]=tot;go[tot]=v;
next[++tot]=head[v];head[v]=tot;go[tot]=u;
}
int size[N],ans[N];
inline void dfs(int u,int fa){
size[u]=1;
for(int i=head[u];i;i=next[i]){
int v=go[i];
if(v==fa)continue;
dfs(v,u);
size[u]+=size[v];
}
ans[u]=size[u];
for(int i=head[u];i;i=next[i]){
int v=go[i];
if(v==fa)continue;
ans[u]+=size[v]*(size[u]-size[v]);
}
}
int main(){
int n,r,m;
cin>>n>>r>>m;
for(int i=1,u,v;i<n;i++){
scanf("%d%d",&u,&v);
add(u,v);
}
dfs(r,r);
while(m--){
int u;
scanf("%d",&u);
printf("%d\n",ans[u]);
}
}
luogu P5002 专心OI - 找祖先的更多相关文章
- P5002 专心OI - 找祖先
P5002 专心OI - 找祖先 给定一棵有根树(\(n \leq 10000\)),\(M \leq 50000\) 次询问, 求以 \(x\) 为 \(LCA\) 的点对个数 错误日志: 看下面 ...
- 洛谷P5002 专心OI - 找祖先
题目概括 题目描述 这个游戏会给出你一棵树,这棵树有\(N\)个节点,根结点是\(R\),系统会选中\(M\)个点\(P_1,P_2...P_M\). 要Imakf回答有多少组点对\((u_i,v_i ...
- 【洛谷 5002】专心OI - 找祖先 (树上计数)
专心OI - 找祖先 题目背景 \(Imakf\)是一个小蒟蒻,他最近刚学了\(LCA\),他在手机\(APP\)里看到一个游戏也叫做\(LCA\)就下载了下来. 题目描述 这个游戏会给出你一棵树,这 ...
- [luogu5002]专心OI - 找祖先
[传送门] 我们还是先将一下算法的步骤,待会再解释起来方便一点. 算法步骤 首先我们算出每个子树的\(size\). 我们就设当前访问的节点 然后我们就得到了当前这个节点的答案是这个树整个的\(siz ...
- 洛谷【P5004 专心OI - 跳房子】 题解
题目链接 https://www.luogu.org/problem/P5004 洛谷 P5004 专心OI - 跳房子 Imakf有一天参加了PINO 2017 PJ组,他突然看见最后一道题 他十分 ...
- [luogu5004]专心OI - 跳房子【矩阵加速+动态规划】
传送门:https://www.luogu.org/problemnew/show/P5004 分析 动态规划转移方程是这样的\(f[i]=\sum^{i-m-1}_{j=0}f[j]\). 那么很明 ...
- luogu P3092 [USACO13NOV]没有找零No Change
题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 ...
- Luogu P3092 [USACO13NOV]没有找零No Change【状压/二分】By cellur925
题目传送门 可能是我退役/NOIP前做的最后一道状压... 题目大意:给你\(k\)个硬币,FJ想按顺序买\(n\)个物品,但是不能找零,问你最后最多剩下多少钱. 注意到\(k<=16\),提示 ...
- HDOJ 题目2475 Box(link cut tree去点找祖先)
Box Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
随机推荐
- mount 和 /etc/fstab关系。
mount -a 自动按照格式执行/etc/fstab里面的文件. /etc/fstab 文件格式: device mount-point type options ...
- php ffmpeg截取视频第一帧保存为图片的方法
php ffmpeg截取视频第一帧保存为图片的方法 <pre> $xiangmupath = $this->getxiangmupath(); $filename = 'chengs ...
- JS中的相等性判断===, ==, Object.is()
首发地址:http://www.geeee.top/2019/11/15/equality-comparisons/,转载请注明出处 相信刚接触JS的人都会被他的想等性判断给整糊涂,看看下面代码,你能 ...
- chrome中安装Vue调试工具vue-devtools
一.前言 vue-devtools是一款基于浏览器的插件,用来调试vue应用.本篇文章将要总结的是如何在chrome中安装Vue的调试工具vue-devtools. 首先能想到的第一种方法就是直接在c ...
- nyoj 108-士兵杀敌(一)(数学)
108-士兵杀敌(一) 内存限制:64MB 时间限制:1000ms 特判: No 通过数:60 提交数:221 难度:3 题目描述: 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. ...
- Python之selenium自动化PART1
本文适合有经验的测试童鞋 一.Selenium自动化测试环境搭建 1.cmd --- pip install selenium==2.53.0 (如果selenium后面不跟==,表示默认安装最新版本 ...
- eNSP仿真软件之利用单臂路由实现VLAN间路由
1. 实验原理 以太网中,通常会使用VLAN技术隔离二层广播域来减少广播的影响,并增强网络的安全性和可管理性.其缺点是同时也严格地隔离了不同VLAN之间的任何二层流量,使分属于不同VLAN的用户不能直 ...
- html——标签基础
img标签:使用 src="xxx" 来链接图片 当图片显示不出来的时候 显示alt 中定义的内容 当图片显示了出来 鼠标移动到图片上的时候 显示的是 title 中定义的 ...
- 借汇编之力窥探String背后的数据结构奥秘
熟悉C++.java.VB等编程语言的朋友都知道String(字符串),它是编程语言中表示文本的数据类型,字符串由若干字符组成的,是所有编程语⾔中⾮常重要的成员.可能很多朋友平时只是使用它,没有仔细研 ...
- cropperjs实践及中文文档(自译)
cropperjs是一款非常强大却又简单的图片裁剪工具,它可以进行非常灵活的配置,支持手机端使用,支持包括IE9以上的现代浏览器.(关键是使用方法简单,几行代码就可以搞定) 实践效果图 如图,可以对指 ...