https://www.lydsy.com/JudgeOnline/problem.php?id=3653

https://www.luogu.org/problemnew/show/P3899

设 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。

看到这题第一反应:woc点分治裸题233。

写了一回:woc点分治怎么写???

所以这就是为什么用主席树的原因了(并不

前两个条件只要固定了a和b我们就知道c的方案一定是a(或b,取决于谁深度大)的子树大小-1.

事实上对于一个节点,它周围可以谈笑风生的节点要么是它的祖先要么是它子树的点。

对于前者,处理dep数组之后就很好解决了。

对于后者,dfs序更新节点再树上主席树维护dep数组记录每个节点的子树大小-1(前缀和)。

查询的时候就是正常的主席树了。

PS:1.5h debug结果:思维定式,结果把主席树建成了和以前树上主席树一样的树就gg,错误请看代码。

#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=3e5+5;
inline int read(){int X=0,w=0;char ch=0;while(!isdigit(ch)){w|=ch=='-';ch=getchar();}while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
struct node{int to,nxt;
}e[N*2];
struct tree{int l,r;ll sum;
}tr[N*20];
int cnt,n,q,head[N],sz[N],dep[N];
int rt[N],idx[N],tot,pool,maxd;
inline void add(int u,int v){e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
}
void insert(int y,int &x,int l,int r,int p,ll w){tr[x=++pool]=tr[y];tr[x].sum+=w;if(l==r)return;int mid=(l+r)>>1;if(p<=mid)insert(tr[y].l,tr[x].l,l,mid,p,w);else insert(tr[y].r,tr[x].r,mid+1,r,p,w);
}
ll query(int y,int x,int l,int r,int l1,int r1){if(r1<l||r<l1)return 0;if(l1<=l&&r<=r1)return tr[x].sum-tr[y].sum;int mid=(l+r)>>1;return query(tr[y].l,tr[x].l,l,mid,l1,r1)+query(tr[y].r,tr[x].r,mid+1,r,l1,r1);
}
void dfs1(int u,int f,int d){idx[u]=++tot;sz[u]=1;dep[u]=d;maxd=max(maxd,d);for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v==f)continue;dfs1(v,u,d+1);sz[u]+=sz[v];}
}
void dfs2(int u,int f){insert(rt[idx[u]-1],rt[idx[u]],1,maxd,dep[u],sz[u]-1);//错误点,曾经写成insert(rt[idx[f]],rt[idx[u]],1,maxd,dep[u],sz[u]-1);for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v==f)continue;dfs2(v,u);}
}
int main(){n=read(),q=read();for(int i=1;i<n;i++){int u=read(),v=read();add(u,v);add(v,u);}dfs1(1,0,1);dfs2(1,0);for(int i=1;i<=q;i++){int p=read(),k=read();ll ans=(ll)(sz[p]-1)*min(dep[p]-1,k);ans+=query(rt[idx[p]-1],rt[idx[p]+sz[p]-1],1,maxd,dep[p]+1,dep[p]+k);printf("%lld\n",ans);}return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8682563.html

BZOJ3653 洛谷3899:谈笑风生——题解相关推荐

  1. 洛谷P1816 忠诚 题解

    洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...

  2. 线性存储的最短平均检索时间(洛谷P1253题题解,Java语言描述)

    题目要求 P1253题目链接 分析 很像 ~洛谷P1223题题解~,也是一种类似SJF的贪心法. 排个序,由于两个不大于10000的数,乘起来还是int,就使用int属性吧. 数据量小,所以Scann ...

  3. 队列模拟约瑟夫问题(洛谷P1996题题解,Java语言描述)

    题目要求 P1996题目链接 分析 以前就研究过"约瑟夫环"问题: <单循环链表求解约瑟夫环问题(Java语言描述)> <杀人游戏~约瑟夫环(洛谷P1145题题解 ...

  4. 洛谷P2108学英语题解

    来我的博客里拥有更好的阅读体验:https://yyxi.ml/2020/07/23/luogu-p2108-xueyingyu/ 洛谷P2108学英语题解(c++) 题目描述 代码.思路 踩过的坑 ...

  5. 洛谷 P1077 摆花 题解

    洛谷 P1077 摆花 题解 洛谷 P1077 题目 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共mmm盆.通过调查顾客的喜好,小明列出了顾客最喜欢的nnn种花,从1到nnn标号.为 ...

  6. 修改数组(洛谷P7285题题解,C++语言描述)

    题目要求 P7285题目链接 分析 这题虽然是红题,但是因为很有趣且是 Special Judge ,所以写篇题解. 乍一看,这题好麻烦啊,要综合考虑xxx和yyy,达到x−yx-yx−y的最优化. ...

  7. 枚举求解单词方阵(洛谷P1101题题解,Java语言描述)

    题目要求 P1101题目链接 分析 可以用DFS做,但我立下了个Flag,所以就用了朴素的枚举来做.... 结果,我的天哪,做了好几个小时-- 其实这种地图题,真的适合 DFS or BFS or D ...

  8. 快速幂||取余运算【模板】(洛谷P1226题题解,Java语言描述)

    题目要求 P1226题目链接 分析 标准的快速幂取模算法板子,之前这个算法我在这篇文章中讲过了:<快速幂算法详解&&快速幂取模算法详解>. 这里选择使用比较简单的API实现 ...

  9. 贪心策略摘果子(洛谷P1478题题解,Java语言描述)

    题目要求 P1478题目链接 分析 本题的低配版题目链接 → 题解 那个题就是纯水题没啥可写的,我除了贴代码无话可说,但这题吧,虽然不算难,但也可一说. 建议大家移步这里 → 精辟题解 这位爷写了本题 ...

最新文章

  1. Android用观察者模式代替广播通知刷新界面
  2. Android事件传递(分发)机制
  3. 在Exchange 2010中批量导入用户
  4. 在Visual Studio中使用任何C++编译器
  5. akka连接是什么_什么是Akka?
  6. wordpress发布模块_如何用WordPress打造出一个类似知乎的问答站点
  7. oracle11g导出空表
  8. 为什么微软应该通过收购Docker来与Kubernetes竞争
  9. Python解释器(Interpreter)介绍
  10. php speex转码为mp3,ffmpeg speex转换为mp3或者aac
  11. 2021年新年元旦,新年开篇两首毛泽东诗词——沁园春:恰同学少年,风华正茂。书生意气,挥斥方遒……...
  12. FRI.Django 中的装饰器及 Auth 模块
  13. Pymol获得蛋白中二级结构信息
  14. 成功解决ValueError: day is out of range for month问题
  15. DevExpress XPO 学习笔记
  16. 克服弱点,愈发完美-自我篇——《人性的弱点》读后感
  17. PPT制作毛玻璃效果
  18. 超表面远场三维辐射图,MATLAB
  19. Nginx的配置及原理
  20. 第一台计算机如何工作原理,世界上第一台计算机是什么原理_世界上第一台计算机...

热门文章

  1. Primavera P6 安装配置指南
  2. from robot.api import logger
  3. 微软更新Azure SQL将可根据重要性工作进行重整顺序
  4. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索_12.4. 额外特性
  5. sublime for mac 注册码
  6. 遇到的几个开机启动故障
  7. 实战操作主机角色转移(二)
  8. iOS开发中用到的第三方库概览
  9. lua对模块接口扩展的一种方法
  10. shellcode xor编码/解码[2]