题目

多组数据多组询问,对于一个点 \(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. win32-GetActiveWindow和GetForegroundWindow

    最近被这两个api搞得有点晕,故查阅了相关的资料. 这篇文章解释的很好:https://devblogs.microsoft.com/oldnewthing/20081006-00/?p=20643 ...

  2. CentOS8安装Docker报错问题解决

    问题描述 CentOS版本:8.5.2111. # cat /etc/redhat-release CentOS Linux release 8.5.2111 安装准备: # 安装所需软件包 sudo ...

  3. 腾讯云视频转码回调 http code 405

    异常信息 405 Method Not Allowed 异常场景 通过腾讯云SDK上传视频,视频转码完成回调我的接口失败,我这边一直没有log.找到腾讯云工作人员,告诉我这边返回405错误和不支持ge ...

  4. JAVA对象生命周期(三)-对象的销毁

    目录 从引用说起 指针直接引用 句柄引用 优缺点 如何判断对象死亡 引用计数法 可达性分析法 垃圾收集算法 标记-清除算法 复制算法 复制算法--优化 有关年轻代的JVM参数 标记-整理算法 分代收集 ...

  5. Nebula Operator 云上实践

    本文首发于 Nebula Graph Community 公众号 嗨,大家好!Nebula Operator 开源也有一段时间了,之前也有一篇相关的博客介绍,但是实践相关的博客却还没有,现在: 它来了 ...

  6. 批量删除mysql库中数据

    -- 查询构建批量删除表语句(根据数据库名称) select concat('delete from ', TABLE_NAME, ' where org_id = "<条件id> ...

  7. 记一次 .NET某设备监控自动化系统 CPU爆高分析

    一:背景 1. 讲故事 先说一下题外话,一个监控别人系统运行状态的程序,结果自己出问题了,有时候想一想还是挺讽刺的,哈哈,开个玩笑,我们回到正题,前些天有位朋友找到我,说他们的系统会偶发性CPU爆高, ...

  8. Delete `␍`

    新电脑遇到的问题 Delete `␍`eslint(prettier/prettier) 网上一搜,一堆解决办法,没有一个说到点子上,都是表面上如何避免,如何设置VSCODE... 都知道是换行符的问 ...

  9. python AI 应用开发编程实战 大模型实战基础(一)

    自从 由美国主导openAi公司开发的gpt大模型问世以来,人工智能技术一直在推动整个科技行业发展,所以当下全球大公司都在布局Ai产品应用,这是这二年出了好几千个Ai产品应用,全球大大小小甚至超出近上 ...

  10. 使用 Docker 部署 File Browser 文件管理系统

    1)File Browser 介绍 官网:https://filebrowser.org/ GitHub:https://github.com/filebrowser/filebrowser 今天为大 ...