Description

设T 为一棵有根树,我们做如下的定义:
• 设a和b为T 中的两个不同节点。如果a是b的祖先,那么称“a比b不知道
高明到哪里去了”。
• 设a 和 b 为 T 中的两个不同节点。如果 a 与 b 在树上的距离不超过某个给定
常数x,那么称“a 与b 谈笑风生”。
给定一棵n个节点的有根树T,节点的编号为1 到 n,根节点为1号节点。你需
要回答q 个询问,询问给定两个整数p和k,问有多少个有序三元组(a;b;c)满足:

  1. a、b和 c为 T 中三个不同的点,且 a为p 号节点;
  2. a和b 都比 c不知道高明到哪里去了;
  3. a和b 谈笑风生。这里谈笑风生中的常数为给定的 k。

Input

输入文件的第一行含有两个正整数n和q,分别代表有根树的点数与询问的个数。接下来n – 1行,每行描述一条树上的边。每行含有两个整数u和v,代表在节点u和v之间有一条边。
接下来q行,每行描述一个操作。第i行含有两个整数,分别表示第i个询问的p和k。


Output

输出 q 行,每行对应一个询问,代表询问的答案。


Solution

线段树合并。
对于要求2明显就是找a的子树。
对于要求3:

  1. b为a父亲 明显ans=siz[a]*min(k,dep[a])
  2. b为a儿子 方案数就是深度在depth[a]+1到depth[a]+K之间每个b的(size[b]-1)之和,那么可以用线段树合并来做,线段树下标表示深度,记区间的(size-1)之和,求线段树在(depth[a]+1,depth[a]+K)的区间和。

每个点开一棵线段树 l和r表示深度范围 父亲合并儿子以更新

计算答案时记得要新开节点。


Code

#include<bits/stdc++.h>
using namespace std;
int n,q;
struct node{int ls,rs;long long num;
}tree[300010*20];int tot=0;
inline void up(int x) {tree[x].num=tree[tree[x].ls].num+tree[tree[x].rs].num;
}
void add(int x,int tl,int tr,int w,int ad) {if(tl==tr) {tree[x].num+=ad;return;}int mid=(tl+tr)/2;if(w<=mid) {if(!tree[x].ls) tree[x].ls=++tot;add(tree[x].ls,tl,mid,w,ad);}if(w>mid) {if(!tree[x].rs) tree[x].rs=++tot;add(tree[x].rs,mid+1,tr,w,ad);}up(x);
}
long long askS(int x,int tl,int tr,int l,int r) {if(!x) return 0;if(tl==l&&r==tr) return tree[x].num;int mid=(tl+tr)/2;long long ans=0;if(l<=mid&&tree[x].ls) ans+=askS(tree[x].ls,tl,mid,l,min(mid,r));if(r>mid&&tree[x].rs) ans+=askS(tree[x].rs,mid+1,tr,max(l,mid+1),r);return ans;
}
int merge(int x,int y,int tl,int tr) {if(x==0||y==0) return x|y;if(tl==tr) {int now=++tot;tree[now].num=tree[x].num+tree[y].num;return now;}int mid=(tl+tr)/2,now=++tot;tree[now].ls=merge(tree[x].ls,tree[y].ls,tl,mid);tree[now].rs=merge(tree[x].rs,tree[y].rs,mid+1,tr);up(now);return now;
}vector<int>po[300010];
int fa[300010],h[300010],siz[300010],rtw[300010];void dfs(int u) {siz[u]=1;for(int j=0;j<(int)po[u].size();j++) {int v=po[u][j];if(fa[u]==v) continue;fa[v]=u;h[v]=h[u]+1;dfs(v);siz[u]+=siz[v];}rtw[u]=++tot;add(rtw[u],1,n,h[u],siz[u]-1);for(int j=0;j<(int)po[u].size();j++) {int v=po[u][j];if(fa[u]==v) continue;rtw[u]=merge(rtw[u],rtw[v],1,n);}
}int main() {cin>>n>>q;int u,v;for(int e=1;e<n;e++) {scanf("%d%d",&u,&v);po[u].push_back(v);po[v].push_back(u);}h[1]=1;dfs(1);int K;for(int z=1;z<=q;z++) {scanf("%d%d",&u,&K);long long ans=1ll*min(h[u]-1,K)*(siz[u]-1);ans+=askS(rtw[u],1,n,h[u]+1,h[u]+K);printf("%lld\n",ans);}return 0;
}

洛谷P3899 [湖南集训]谈笑风生相关推荐

  1. 洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)

    题目链接:点击查看 题目大意:设 TTT 为一棵有根树,我们做如下的定义: 设 aaa 和 bbb 为 TTT 中的两个不同节点.如果 aaa 是 bbb 的祖先,那么称"aaa 比 bbb ...

  2. P3899 [湖南集训]谈笑风生(线段树合并)

    P3899 [湖南集训]谈笑风生 给定一颗以111号节点为根的树,如果a≠ba \neq ba​=b,且aaa是bbb的祖先,则aaa比bbb更厉害,如果a≠ba \neq ba​=b,且dis( ...

  3. P3899 [湖南集训]谈笑风生

    P3899 [湖南集训]谈笑风生 题目描述 Solution 我们考虑离线询问,将询问放在相对应的子树ppp中计算答案. 显然a,b,ca,b,ca,b,c的位置关系有两种情况: bbb是aaa的祖先 ...

  4. luogu P3899 [湖南集训]谈笑风生 线段树合并

    Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称"a比b不知道 高明到哪里去了". ? 设a 和 b 为 ...

  5. P3899 [湖南集训]谈笑风生 主席树解决二维数点

    传送门 文章目录 题意: 思路: 题意: 思路: 由于a,ba,ba,b都比ccc厉害,那么a,ba,ba,b一定是某个是某个的祖先.那么就分为两种情况了: (1)(1)(1) bbb在aaa上面,约 ...

  6. P3899 [湖南集训]更为厉害(线段树合并、长链剖分、二维数点)

    P3899 [湖南集训]更为厉害 若 deepb<deepa\text{deep}_b<\text{deep}_adeepb​<deepa​:c 在点 a 的子树中,根据乘法原理计算 ...

  7. [湖南集训] 谈笑风生

    题意: 设 T 为一棵有根树,我们做如下的定义: • 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称"a 比 b 不知道高明到哪里去了". • 设 a ...

  8. [湖南集训]谈笑风生

    谈笑风生 题目大意: 给定a,求任何一个距 a 距离不超过给定的 k 的 b ,然后求一个 c 使得其为 a,b 的后代,求这样的三元组共有多少个. 数据结构好题啊! 解法分析: 我们可以深搜两遍(其 ...

  9. bzoj 3653 [湖南集训]谈笑风生

    题目描述 设 T 为一棵有根树,我们做如下的定义: • 设 a 和 b 为 T 中的两个不同节点.如果 a 是 b 的祖先,那么称"a 比 b 不知道高明到哪里去了". • 设 a ...

最新文章

  1. linux网卡入流速,linux下简单限制网卡速度与
  2. OpenGL Assimp模型加载库
  3. kafka grpc_模型服务:流处理与使用Java,gRPC,Apache Kafka,TensorFlow的RPC / REST
  4. 解析浏览器访问服务器 Servlet 应用程序的交互过程(Servlet 容器如何处理请求资源路径)
  5. Android 应用开发(32)--工程相关解析(各种文件,资源访问)
  6. Mysql5.6.x版本半同步主从复制的开启方法
  7. 探索服务设计的深层定义
  8. Java数据类型及类型转换
  9. Java http发送post请求
  10. 数据挖掘面试题之梯度提升树
  11. Jaccard相似度和广义Jaccard相似度
  12. Chrome视频加速播放器(下载安装记录)
  13. linux中firewalld之direct rules和rich rules(转发,伪装)
  14. 图片如何高清修复?高清修复图片的方法
  15. 我的世界服务器商店系统指令,我的世界自动商店指令 | 手游网游页游攻略大全...
  16. 网络聊天室(linux,java,Android)
  17. echarts引导线_如何使用引导线获得更清晰的照片
  18. 实现商品分类和品牌管理功能
  19. 【论文复现】Consistent Video Depth Estimation
  20. UI设计师有哪些就业方向选择?

热门文章

  1. Windows装逼操作
  2. vb里的lbound和ubound的用法
  3. ROCKET 数据可视化可以如此简单
  4. 有线广电如何转型和发展
  5. 怎样正确理解LOOPBACK接口?
  6. poi-tl导出word;自定义列表序号和表格宽度,表格合并,自定义标题,更新目录
  7. Python爬虫实战(2)之爬取NBA球队各个球员头像图片
  8. mysql-索引分析
  9. can‘t connect to mysql server on localhost解决办法。 net start mysql——无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动。
  10. iOS LBS地图服务--高德地图使用大全