传送门:bzoj4543


题解

三点两两距离相等的情况如下图:

f [ i ] [ j ] f[i][j] f[i][j]表示 i i i子树中与 i i i距离为 j j j(相对深度为 j j j)的结点个数,

g [ i ] [ j ] g[i][j] g[i][j]表示 i i i子树中点对 ( x , y ) (x,y) (x,y),满足 d e p x = d e p y , d i s ( l c a ( x , y ) , i ) + j = d i s ( x , l c a ( x , y ) ) = d i s ( y , l c a ( x , y ) ) dep_x=dep_y,dis(lca(x,y),i)+j=dis(x,lca(x,y))=dis(y,lca(x,y)) depx​=depy​,dis(lca(x,y),i)+j=dis(x,lca(x,y))=dis(y,lca(x,y))的对数(如图中点对(1,2))。

对于点 x x x,统计其相当于图中B点(三元组 L C A LCA LCA)时的贡献:
首先 a n s + = g [ x ] [ 0 ] ans+=g[x][0] ans+=g[x][0],假设每次新加入的儿子结点为 y y y,则遍历所有合法深度 k k k, a n s + = g [ y ] [ k − 1 ] × f [ x ] [ k ] + g [ x ] [ k ] × f [ y ] [ k − 1 ] ans+=g[y][k-1]\times f[x][k]+g[x][k]\times f[y][k-1] ans+=g[y][k−1]×f[x][k]+g[x][k]×f[y][k−1]

转移:
g [ x ] [ k ] + = f [ x ] [ k ] ∗ f [ y ] [ k − 1 ] g[x][k]+=f[x][k]*f[y][k-1] g[x][k]+=f[x][k]∗f[y][k−1]
g [ x ] [ k ] + = g [ y ] [ k + 1 ] g[x][k]+=g[y][k+1] g[x][k]+=g[y][k+1]
f [ x ] [ k ] + = f [ y ] [ k − 1 ] f[x][k]+=f[y][k-1] f[x][k]+=f[y][k−1]

发现每次 k → k − 1 / k + 1 k\rightarrow k-1/k+1 k→k−1/k+1的变换可以用指针数组位移来 O ( 1 ) O(1) O(1)实现。
考虑长链剖分,每次继承重儿子的信息,暴力合并轻儿子。

时间复杂度 O ( n ) O(n) O(n)


代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+20;
typedef long long ll;int n,m,mxdp[N],d[N],son[N];
int head[N],to[N<<1],nxt[N<<1],tot;
ll ans,a[N*10],*nw=a;
ll *f[N],*g[N];inline void lk(int u,int v)
{to[++tot]=v;nxt[tot]=head[u];head[u]=tot;}void dfs(int x,int fr)
{int i,j,k;mxdp[x]=x;d[x]=d[fr]+1;for(i=head[x];i;i=nxt[i]) if((j=to[i])!=fr){dfs(j,x);if(d[mxdp[j]]>d[mxdp[x]]) mxdp[x]=mxdp[j],son[x]=j;}for(i=head[x];i;i=nxt[i]){j=to[i];if(j==fr || ((x!=1) && j==son[x])) continue;j=mxdp[j];k=d[j]-d[x];f[j]=(nw+=(k+1));g[j]=(++nw);nw+=((k<<1)+5);}
}void dp(int x,int fr)
{int i,j,k,t;   if(son[x]) {dp(son[x],x);f[x]=f[son[x]]-1;g[x]=g[son[x]]+1;}ans+=g[x][0];f[x][0]=1;for(i=head[x];i;i=nxt[i]){j=to[i];if(j==fr || j==son[x]) continue;dp(j,x);t=d[mxdp[j]]-d[x];for(k=0;k<=t;++k) ans+=g[x][k+1]*f[j][k]+f[x][k-1]*g[j][k];for(k=0;k<=t;++k){g[x][k-1]+=g[j][k];g[x][k+1]+=f[x][k+1]*f[j][k];f[x][k+1]+=f[j][k];}}
}int main(){int i,x,y;scanf("%d",&n);for(i=1;i<n;++i){scanf("%d%d",&x,&y);lk(x,y);lk(y,x);}dfs(1,0);dp(1,0);printf("%lld",ans);return 0;
}

【BZOJ】4543: [POI2014]Hotel加强版-长链剖分DP相关推荐

  1. P5904-[POI2014]HOT-Hotels加强版【长链剖分,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P5904 题目大意 nnn个点的一棵树,求有多少个点对(i,j,k)(i,j,k)(i,j,k)使得这三个点距离相等 ...

  2. BZOJ 3653: 谈笑风生(离线, 长链剖分, 后缀和)

    题意 给你一颗有 \(n\) 个点并且以 \(1\) 为根的树.共有 \(q\) 次询问,每次询问两个参数 \(p, k\) .询问有多少对点 \((p, a, b)\) 满足 \(p,a,b\) 为 ...

  3. 【CF1009F】 Dominant Indices (长链剖分+DP)

    题目链接 \(O(n^2)\)的\(DP\)很容易想,\(f[u][i]\)表示在\(u\)的子树中距离\(u\)为\(i\)的点的个数,则\(f[u][i]=\sum f[v][i-1]\) 长链剖 ...

  4. P7581-「RdOI R2」路径权值【长链剖分,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P7581 题目大意 给出nnn个点的有边权有根树,mmm次询问一个节点xxx的所有kkk级儿子两两之间路径长度. 1 ...

  5. BZOJ4543/BZOJ3522 [POI2014]Hotel加强版(长链剖分)

    题目好神仙--这个叫长链剖分的玩意儿更神仙-- 考虑dp,设\(f[i][j]\)表示以\(i\)为根的子树中到\(i\)的距离为\(j\)的点的个数,\(g[i][j]\)表示\(i\)的子树中有\ ...

  6. BZOJ4543 POI2014 Hotel加强版 【长链剖分】【DP】*

    BZOJ4543 POI2014 Hotel加强版 Description 同OJ3522 数据范围:n<=100000 Sample Input 7 1 2 5 7 2 5 2 3 5 6 4 ...

  7. 【BZOJ4543】【POI2014】Hotel加强版(长链剖分)

    传送门 题意:求树上满足三点之间距离两两相等的三元组个数 n≤1e5n\le 1e5n≤1e5 原题数据是n≤5000n\le5000n≤5000 考虑怎么做 f[u][i]f[u][i]f[u][i ...

  8. 【BZOJ4543】Hotel加强版【神仙树形dp】【长链剖分】

    题意:给一棵 nnn 个点的树,求两两距离相等的三元组个数. n≤105n\leq 10^5n≤105 显然相当于是找一个点到这三个点距离相等.子树内和子树外到当前点的距离为某个值的点的个数可以长链剖 ...

  9. P3565 [POI2014]HOT-Hotels(树形dp+长链剖分)

    P3565 [POI2014]HOT-Hotels 参考题解 题目大意: 给定一棵树,在树上选 3 个点,要求两两距离相等,求方案数. 三个点树上两两距离为d存在下面两种情况 某个点三个子树(保证该点 ...

最新文章

  1. 巧用CSS的 Mask 滤镜
  2. 谷歌程序员犯低级错误?少打一个字符引发重大 Bug,致大量 Chromebook 无法解锁...
  3. 发掘数据中的信息 -- 数据探索之描述性统计
  4. Java项目启动时执行指定方法的几种方式
  5. 解析时代需要什么样的根目录,中国科技需要什么样的根技术
  6. 成功解决AttributeError: module ‘dask.array.numpy_compat‘ has no attribute ‘take_along_axis‘
  7. crontab 时间参数解释
  8. codeblock 带mingw的版本_云顶之弈10.22新版本最强阵容排名 10.22版本吃鸡阵容推荐...
  9. Python selenium web UI之Chrome 与 Chromedriver对应版本映射表及下载地址和配置(windows, Mac OS)...
  10. 作者:高辉,男,博士,中国国防科技信息中心工程师。
  11. 关于项目IIS CPU100%故障临时解决方案
  12. 魏兴华_ORACLE优化器革命漫谈
  13. 变分模态分解(VMD)原理-附代码
  14. 清华大学中文语音识别数据 THCHS30
  15. 荣耀总裁赵明揭秘华为薪酬制度:不看资历,只看贡献
  16. linux 升级内核 声卡 失效,Deepin 20升级后系统无声音的另一种解决方案
  17. iOS应用性能调优--初级---王朋
  18. 让不懂编程的人爱上iPhone开发(2017iOS11+Swift4+Xcode9版)-第5篇
  19. IoT原型开发利用现成的单板设计---凯利讯半导体
  20. Python可视化34|matplotlib-多子图绘制(为所欲为版)

热门文章

  1. 读书笔记(三)工作票数据挖掘
  2. Ubuntu增大屏幕可用面积之——自动隐藏顶部状态栏
  3. 福利丨微信公众号“人工智能爱好者俱乐部”留言赠书活动结果公布(第三季)
  4. AE学习笔记 Plexus插件应用
  5. 用PL/SQL语言编写一程序,实现按部门分段(6000以上、(6000,3000)、3000元以下)统计各工资段的职工人数、以及各部门的工资总额(工资总额中不包括奖金)
  6. [转载]完整谈谈Omnifocus的行动清单、任务清单、截止日期的概念
  7. tendaac18虚拟服务器,千兆智能路由如何快速设置?以腾达AC18为例
  8. centos7中启用rc-local服务
  9. 5行代码实现虎牙自动发送弹幕
  10. word怎样从第三页开始设置页码