BZOJ3653 洛谷3899:谈笑风生——题解
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) 满足:
a、 b 和 c 为 T 中三个不同的点,且 a 为 p 号节点;
a 和 b 都比 c 不知道高明到哪里去了;
- 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:谈笑风生——题解相关推荐
- 洛谷P1816 忠诚 题解
洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...
- 线性存储的最短平均检索时间(洛谷P1253题题解,Java语言描述)
题目要求 P1253题目链接 分析 很像 ~洛谷P1223题题解~,也是一种类似SJF的贪心法. 排个序,由于两个不大于10000的数,乘起来还是int,就使用int属性吧. 数据量小,所以Scann ...
- 队列模拟约瑟夫问题(洛谷P1996题题解,Java语言描述)
题目要求 P1996题目链接 分析 以前就研究过"约瑟夫环"问题: <单循环链表求解约瑟夫环问题(Java语言描述)> <杀人游戏~约瑟夫环(洛谷P1145题题解 ...
- 洛谷P2108学英语题解
来我的博客里拥有更好的阅读体验:https://yyxi.ml/2020/07/23/luogu-p2108-xueyingyu/ 洛谷P2108学英语题解(c++) 题目描述 代码.思路 踩过的坑 ...
- 洛谷 P1077 摆花 题解
洛谷 P1077 摆花 题解 洛谷 P1077 题目 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共mmm盆.通过调查顾客的喜好,小明列出了顾客最喜欢的nnn种花,从1到nnn标号.为 ...
- 修改数组(洛谷P7285题题解,C++语言描述)
题目要求 P7285题目链接 分析 这题虽然是红题,但是因为很有趣且是 Special Judge ,所以写篇题解. 乍一看,这题好麻烦啊,要综合考虑xxx和yyy,达到x−yx-yx−y的最优化. ...
- 枚举求解单词方阵(洛谷P1101题题解,Java语言描述)
题目要求 P1101题目链接 分析 可以用DFS做,但我立下了个Flag,所以就用了朴素的枚举来做.... 结果,我的天哪,做了好几个小时-- 其实这种地图题,真的适合 DFS or BFS or D ...
- 快速幂||取余运算【模板】(洛谷P1226题题解,Java语言描述)
题目要求 P1226题目链接 分析 标准的快速幂取模算法板子,之前这个算法我在这篇文章中讲过了:<快速幂算法详解&&快速幂取模算法详解>. 这里选择使用比较简单的API实现 ...
- 贪心策略摘果子(洛谷P1478题题解,Java语言描述)
题目要求 P1478题目链接 分析 本题的低配版题目链接 → 题解 那个题就是纯水题没啥可写的,我除了贴代码无话可说,但这题吧,虽然不算难,但也可一说. 建议大家移步这里 → 精辟题解 这位爷写了本题 ...
最新文章
- Android用观察者模式代替广播通知刷新界面
- Android事件传递(分发)机制
- 在Exchange 2010中批量导入用户
- 在Visual Studio中使用任何C++编译器
- akka连接是什么_什么是Akka?
- wordpress发布模块_如何用WordPress打造出一个类似知乎的问答站点
- oracle11g导出空表
- 为什么微软应该通过收购Docker来与Kubernetes竞争
- Python解释器(Interpreter)介绍
- php speex转码为mp3,ffmpeg speex转换为mp3或者aac
- 2021年新年元旦,新年开篇两首毛泽东诗词——沁园春:恰同学少年,风华正茂。书生意气,挥斥方遒……...
- FRI.Django 中的装饰器及 Auth 模块
- Pymol获得蛋白中二级结构信息
- 成功解决ValueError: day is out of range for month问题
- DevExpress XPO 学习笔记
- 克服弱点,愈发完美-自我篇——《人性的弱点》读后感
- PPT制作毛玻璃效果
- 超表面远场三维辐射图,MATLAB
- Nginx的配置及原理
- 第一台计算机如何工作原理,世界上第一台计算机是什么原理_世界上第一台计算机...
热门文章
- Primavera P6 安装配置指南
- from robot.api import logger
- 微软更新Azure SQL将可根据重要性工作进行重整顺序
- PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索_12.4. 额外特性
- sublime for mac 注册码
- 遇到的几个开机启动故障
- 实战操作主机角色转移(二)
- iOS开发中用到的第三方库概览
- lua对模块接口扩展的一种方法
- shellcode xor编码/解码[2]