题目

多组数据多组询问,对于一个点 \(x\) 和 树上的距离 \(k\),问 \(\sum_{i=1}^n[Dis(x,i)==k]\)


分析

卡了一页的常,发现两个 \(\log\) 过不去,有一个技巧就是 vector 的 resize 函数,

点分树有一个性质,子树的深度不超过子树大小的一半,反正直接用 vector 就行了


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#include <vector>
#define register
using namespace std;
const int N=100011; bool v[N]; struct node{int y,next;}e[N<<1];
int big[N],siz[N],SIZ,dfn[N],Siz[N],fat[N],root,n,m,as[N],tot;
int dep[N],et=1,two[18],lg[N<<1],f[N<<1][18]; vector<int>K[N][2];
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
void Max(int &a,int b){a=a>b?a:b;}
void Min(int &a,int b){a=a<b?a:b;}
int Get_Min(int x,int y){return dep[x]<dep[y]?x:y;}
int lca(int x,int y){
if (x>y) x^=y,y^=x,x^=y; int z=lg[y-x+1];
return Get_Min(f[x][z],f[y-two[z]+1][z]);
}
int Dis(int x,int y){
int LCA=lca(dfn[x],dfn[y]);
return dep[x]+dep[y]-2*dep[LCA];
}
void dfs(int x,int fa){
siz[x]=1,big[x]=0;
for (int i=as[x];i;i=e[i].next)
if (e[i].y!=fa&&!v[e[i].y]){
dfs(e[i].y,x);
siz[x]+=siz[e[i].y];
Max(big[x],siz[e[i].y]);
}
Max(big[x],SIZ-siz[x]);
if (big[x]<=big[root]) root=x;
}
void dp(int x){
v[x]=1,Siz[x]=(big[0]>>1)+1;
for (int i=as[x];i;i=e[i].next)
if (!v[e[i].y]){
big[0]=SIZ=siz[e[i].y];
dfs(e[i].y,root=0),
fat[root]=x,dp(root);
}
}
void Dfs(int x,int fa){
f[dfn[x]=++tot][0]=x,dep[x]=dep[fa]+1;
for (int i=as[x];i;i=e[i].next)
if (e[i].y!=fa)
Dfs(e[i].y,x),f[++tot][0]=x;
}
void Update(int x){
int now=x;
for (;now;now=fat[now]){
++K[now][0][Dis(now,x)];
if (fat[now]) ++K[now][1][Dis(fat[now],x)];
}
}
int Query(int x,int y){
int now=x,ans=0;
if (y<=Siz[x]) ans=K[now][0][y];
for (;fat[now];now=fat[now]){
int d=Dis(x,fat[now]),t=y-d;
if (t<0||t>Siz[fat[now]]) continue;
ans+=K[fat[now]][0][t]-K[now][1][t];
}
return ans;
}
int main(){
lg[0]=-1,two[0]=1;
for (int i=1;i<21;++i) two[i]=two[i-1]<<1;
for (int i=1;i<N*2;++i) lg[i]=lg[i>>1]+1;
for (int T=iut();T;--T){
n=iut(),m=iut(),et=1,tot=0;
for (int i=1;i<n;++i){
int x=iut(),y=iut();
e[++et]=(node){y,as[x]},as[x]=et;
e[++et]=(node){x,as[y]},as[y]=et;
}
big[0]=SIZ=n,Dfs(1,0);
for (int j=1;j<=lg[tot];++j)
for (int i=1;i+two[j]-1<=tot;++i)
f[i][j]=Get_Min(f[i][j-1],f[i+two[j-1]][j-1]);
dfs(1,root=0),dfs(root,0),dp(root);
for (int i=1;i<=n;++i) K[i][0].resize(Siz[i]+1),K[i][1].resize(Siz[fat[i]]+1);
for (int i=1;i<=n;++i) Update(i);
for (int i=1;i<=m;++i){
int x=iut(),y=iut();
print(Query(x,y)),putchar(10);
}
for (int i=1;i<=n;++i) as[i]=fat[i]=v[i]=0,K[i][0].clear(),K[i][1].clear();
}
return 0;
}

#点分树#洛谷 6626 [省选联考 2020 B 卷] 消息传递的更多相关文章

  1. 洛谷P6623——[省选联考 2020 A 卷] 树

    传送门:QAQQAQ 题意:自己看 思路:正解应该是线段树/trie树合并? 但是本蒟蒻啥也不会,就用了树上二次差分 (思路来源于https://www.luogu.com.cn/blog/dengy ...

  2. 洛谷 P6624 - [省选联考 2020 A 卷] 作业题(矩阵树定理+简单数论)

    题面传送门 u1s1 这种题目还是相当套路的罢 首先看到 \(\gcd\) 可以套路地往数论方向想,我们记 \(f_i\) 为满足边权的 \(\gcd\) 为 \(i\) 的倍数的所有生成树的权值之和 ...

  3. [题解] LOJ 3300 洛谷 P6620 [省选联考 2020 A 卷] 组合数问题 数学,第二类斯特林数,下降幂

    题目 题目里要求的是: \[\sum_{k=0}^n f(k) \times X^k \times \binom nk \] 这里面出现了给定的多项式,还有组合数,这种题目的套路就是先把给定的普通多项 ...

  4. 洛谷 P7520 - [省选联考 2021 A 卷] 支配(支配树)

    洛谷题面传送门 真·支配树不 sb 的题. 首先题面已经疯狂暗示咱们建出支配树对吧,那咱就老老实实建呗.由于这题数据范围允许 \(n^2\)​ 算法通过,因此可以考虑 \(\mathcal O(n^2 ...

  5. 洛谷 P7515 - [省选联考 2021 A 卷] 矩阵游戏(差分约束)

    题面传送门 emmm--怎么评价这个题呢,赛后学完差分约束之后看题解感觉没那么 dl,可是现场为啥就因为种种原因想不到呢?显然是 wtcl( 先不考虑"非负"及" \(\ ...

  6. luoguP6623 [省选联考 2020 A 卷] 树(trie树)

    luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...

  7. luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理)

    luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理) Luogu 题外话: Day2一题没切. 我是傻逼. 题解时间 某种意义上说刻在DNA里的柿子,大概是很多人学 ...

  8. [省选联考 2020 A 卷] 组合数问题

    题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...

  9. luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)

    luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ...

  10. 洛谷 P7516 - [省选联考 2021 A/B 卷] 图函数(Floyd)

    洛谷题面传送门 一道需要发现一些简单的性质的中档题(不过可能这道题放在省选 D1T3 中偏简单了?) u1s1 现在已经是 \(1\text{s}\)​ \(10^9\)​ 的时代了吗?落伍了落伍了/ ...

随机推荐

  1. 【Java复健指南13】OOP高级04【告一段落】-四大内部类

    四大内部类 一个类的内部又完整的嵌套了另一个类结构. class Outer{ //外部类 class lnner{ //内部类 } } class Other{//外部其他类 } 被嵌套的类称为内部 ...

  2. 运行Study.Trade模块的Web.Unified.Host

    1.把Web.Host的项目设置为启动项目 上一篇文章报错,因为npm功能没有安装,导致Web.Unified.Host的wwwroot下没有libs目录. 2.默认是在IIS Express中承载 ...

  3. 【Azure App Service】误删除App Service资源,怎么办?

    问题描述 操作不当,误删除了App Service的资源,怎么办? 问题解答 根据Azure 官方文档,可以使用 Powershell 命令恢复到原始 App Service 应用名称. 操作步骤 第 ...

  4. Jetpack的ViewModel与LiveData总结

    本文基于SDK 29 一.ViewModel与LiveData的作用: 1.viewModel: 数据共享,屏幕旋转不丢失数据,并且在Activity与Fragment之间共享数据. 2.LiveDa ...

  5. FeignClient 报错: A bean with that name has already been defined and overriding is disabled.

    1. 错误信息 *************************** APPLICATION FAILED TO START *************************** Descript ...

  6. springboot中使用restTemplate发送带参数和请求头的post,get请求

    最近在工作中使用到了用restTemplate去获取网站数据填入到数据库中,在这里记录下来以便以后使用: 添加相关依赖:版本使用springboot中的 <dependency> < ...

  7. vue2init vue2z

    <template> <div> </div> </template> <script> export default { name: 'b ...

  8. 日常办公——Excel中重复打印标题的设置

    打印预览时,所在数据行或列不能显示在同一页,在打印区域之外还有内容,为了方便阅读,可使用顶端标题行重复或左端标题行重复,具体方法如下: 按顺序操作,完成后点击确定即完成操作.

  9. Review Book for GEE(Graduate Entrance Examination)

    English is made up of phrases and idioms, in the case of both written and spoken usage. When learnin ...

  10. 基于4G的智能工牌解决方案特色解析

    前记  随着数字化的不断发展以及cat1模块的竞争加剧.cat1无论从成本或者功耗上,都进化的特别快.这样的前提下,让基于4G可穿戴产品逐渐成为现实可穿戴产品必备.能解决以前很多不能解决的问题.  作 ...