题目描述

这个游戏会给出你一棵树,这棵树有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]);
}
}

最新文章

  1. 缓存技术Redis在C#中的使用及Redis的封装
  2. ArcGIS JS 学习笔记3 实现百度风格的BubblePopup
  3. Java接口中的方法
  4. Protobuf C#教程 ThriftC#教程大合辑
  5. QT 网络编程三(TCP版)
  6. Android系列之网络(二)----HTTP请求头与响应头
  7. 【python PIL学习】给照片打水印
  8. linux exec用法总结
  9. nginx ssi 配置小细节(一)
  10. 【BZOJ】【1406】【AHOI2007】密码箱
  11. 【官方文档】Hadoop分布式文件系统:架构和设计
  12. 如何使用json在前后台进行数据传输
  13. 加速器eaccelerator不兼容高版本php
  14. CSS实现导航条Tab切换的三种方法
  15. 激活IDEA 2017.3 mac版 2018.05.21亲测可用
  16. Skyline 7 版本TerraExplorer Pro二次开发快速入门
  17. box-shodow的使用
  18. 微信小程序将网络图片转化为base64
  19. 7.2 if else 语句
  20. vue-cli 第一章

热门文章

  1. JDK下载安装配置教程(详细)
  2. [转载]2.4 UiPath循环活动While的介绍和使用
  3. SysTick系统定时器
  4. printf的实现原理
  5. sso单点登录系统
  6. css字体图标的制作
  7. C# Web分页功能实现
  8. B0宏
  9. .NET开发者的机遇与WebAssembly发展史(有彩蛋)
  10. ubuntu 16.04上源码编译opengv | compile opengv on ubuntu 16.04