正题

题目链接:https://www.luogu.com.cn/problem/P3899


题目大意

给出nnn个点的一棵有根树,每次询问一个(p,k)(p,k)(p,k),求有多少个点对(b,c)(b,c)(b,c)满足

  1. ppp和bbb是ccc的祖先
  2. bbb与ppp的距离不超过kkk
    蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤\color{white}蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤蛤

解题思路

首先如果bbb在aaa上方,那么点bbb的个数可以用深度来求,而ccc的数量就是aaa的子树大小−1-1−1

如果bbb在aaa的下方,ccc的数量就是bbb的子树大小−1-1−1,也就是对于每个bbb它的贡献是它的子树大小−1-1−1,那么就求我们在aaa的子树中与aaa距离不超过kkk的点的权值和即可。

这个可以用dfsdfsdfs序和主席树维护,时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define siz(x) (ed[x]-dfn[x]+1)
using namespace std;
const ll N=3e5+10,M=6e6+10;
struct node{ll to,next;
}a[N*2];
ll n,q,tot,cnt,D,ls[N],dep[N];
ll dfn[N],ed[N],rt[N],rfn[N];
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
void dfs(ll x,ll fa){dfn[x]=++cnt;rfn[cnt]=x;dep[x]=dep[fa]+1;D=max(D,dep[x]);for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa)continue;dfs(y,x);}ed[x]=cnt;
}
struct Seg_Tree{ll cnt,sum[M],ls[M],rs[M];ll Change(ll x,ll L,ll R,ll pos,ll val){ll y=++cnt;sum[y]=sum[x]+val;if(L==R){return y;}ll mid=(L+R)>>1;if(pos<=mid)ls[y]=Change(ls[x],L,mid,pos,val),rs[y]=rs[x];else rs[y]=Change(rs[x],mid+1,R,pos,val),ls[y]=ls[x];return y;}ll Ask(ll x,ll y,ll L,ll R,ll l,ll r){if(!(sum[y]-sum[x]))return 0;if(L==l&&R==r)return sum[y]-sum[x];ll mid=(L+R)>>1;if(r<=mid)return Ask(ls[x],ls[y],L,mid,l,r);if(l>mid)return Ask(rs[x],rs[y],mid+1,R,l,r);return Ask(ls[x],ls[y],L,mid,l,mid)+Ask(rs[x],rs[y],mid+1,R,mid+1,r);}
}T;
int main()
{scanf("%lld%lld",&n,&q);for(ll i=1;i<n;i++){ll x,y;scanf("%lld%lld",&x,&y);addl(x,y);addl(y,x);}dfs(1,0);for(ll i=1;i<=n;i++){int x=rfn[i];rt[i]=T.Change(rt[i-1],1,D,dep[x],siz(x)-1);}while(q--){ll p,k;scanf("%lld%lld",&p,&k);ll ans=min(k,dep[p]-1)*(siz(p)-1);printf("%lld\n",ans+T.Ask(rt[dfn[p]],rt[ed[p]],1,D,dep[p]+1,dep[p]+k));}
}

P3899-[湖南集训]谈笑风生【主席树】相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 洛谷P3899 [湖南集训]谈笑风生

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

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

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

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

    传送门 一.做法 CCC一定是A,BA, BA,B公共子树里的点 B在A上方 则C一定在A子树中 ans=min⁡{k,dep[A]−1}×(siz[A]−1)ans=\min\{k,dep[A]-1 ...

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

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

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

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

最新文章

  1. 以Attention Model为例谈谈两种研究创新模式
  2. JAVA post和get方式请求远程HTTP接口
  3. linux pwn练习0x01
  4. js中“||”和“”的高级用法 js,与或运算符 || 妙用
  5. 工作多年的.NET程序员,是否建立了自己的开发知识库?分享制作电子书的经验...
  6. 1285B. Just Eat It
  7. 多线程:CopyOnWriteArrayList
  8. notepad可以运行python吗,notepad+中怎么设置直接运行python代码
  9. matlab2016b版本安装
  10. win和linux同步文件,Linux和windows系统文件的实时同步
  11. jclasslib插件_JClassLib
  12. git文件没有绿色红色小图标
  13. MySQL 查询语句返回某字段出现超过1次的所有记录
  14. NOI国家集训队论文分类整理
  15. 纹理(讲得比较详细的文章)
  16. 关于 Kubernetes中Pod健康检测和服务可用性检查的一些笔记(LivenessProbe+ReadinessProbe)
  17. Windows系统连接蓝牙音箱,已连接,没有声音
  18. 计算View中的子View在View的superview中的坐标
  19. QT中文字体显示以及字体大小不能改变的问题
  20. CTR --- NFM论文阅读笔记,及tf2复现

热门文章

  1. java怎么打印进制,java编程思维_007打印二进制,八进制,十六进制
  2. mysql 5.7.6 5.7.19_MySQL数据库之Mysql 5.7.19 免安装版遇到的坑(收藏)
  3. mysql的外键_mysql如何查看外键
  4. python frame用法_python—dataframe用法
  5. 算法设计与分析——贪心算法——多机调度问题
  6. java编写记事本程序出现图形,高手帮忙啊,老师布置了一个作业,要用java编写一个记事本程序...
  7. 吴恩达DeepLearningCourse5-序列模型
  8. 计算机检测维修与数据恢复课件,2017年全国职业院校技能大赛中职组“计算机检测维修与数据恢复”赛项说明会ppt课件.ppt...
  9. mysql qps如何查看_一款查看mysql QPS的脚本
  10. [Java基础]Lambda表达式的格式与使用前提