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 ... 
随机推荐
- 高性能Web动画和渲染原理系列(4)“Compositor-Pipeline演讲PPT”学习摘要
			目录 摘要 1.合成流水线 2. 预定义UI层 3. paint是什么意思 4. 分层的优势和劣势 5. 视图属性及其处理方式 6. Quads 7. Compositor Frame 8. 关于光栅 ... 
- egret开发方法(最笨的方法)
			egret开发方法(最笨的方法)1 1个精灵1个对象名字 获取精灵设置属性也是直接获取对象设置属性 (不用想的少些代码 因为没有jquery好用) ps:如果要设置很多个精灵属性 那可以添加到数组 然 ... 
- MD5 加盐加密
			一.概述 MD5(Message Digest Algorithm 5),是一种散列算法,是不可逆的,即通过md5加密之后没办法得到原文,没有解密算法. 在一般的项目中都会有登录注册功能,最简单的, ... 
- Linux下编写-makefile-详细教程(跟我一起写-Makefile-Markdown整理版)
			目录 概述 关于程序的编译和链接 Makefile 介绍 Makefile的规则 一个演示例子 make是怎样工作的 makefile中使用变量 让make自己主动推导 另类风格的makefile 清 ... 
- hdu 3342 Legal or Not (topsort)
			Legal or NotTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ... 
- VLAN实验(3)
			1.选择2台S3700和5台pc机,并根据实验编址完成此拓扑图. 2.启动设备,检查设备的连通性: 由于现在我们还没有划分VLAN,这5台PC,还在同一个VLAN中,现在我们启动所有的设备,这是所有的 ... 
- js 关于apply和call的理解使用
			关于call和apply,以前也思考良久,很多时候都以为记住了,但是,我太难了.今天我特地写下笔记,希望可以完全掌握这个东西,也希望可以帮助到任何想对学习这个东西的同学. 一.apply函数定义与理解 ... 
- 剑指Offer-27.字符串的排列(C++/Java)
			题目: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入 ... 
- 【NHOI2018】扑克游戏
			[问题描述] 有一种别样“小猫钓鱼”扑克游戏.有 N 张牌,每张牌都有一个花色和点数.游戏的规则:扑克接龙时,若前面有同样花色的牌,你可以将这两张牌连同之间的牌都取走,得到的分值为取走牌点数之和.这里 ... 
- C语言之修改常量
			前言:指针!菜鸟的终点,高手的起点.漫谈一些进阶之路上的趣事:记录一些语言本身的特性以及思想,没有STL,也没有API! 0x01: 程序内存中的存储划分 对于程序在内存中是如何分布的,网上有多个解释 ... 
