正题

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


题目大意

nnn个点的一棵树,求有多少个点对(i,j,k)(i,j,k)(i,j,k)使得这三个点距离相等。


解题思路

有两种情况,一是iii是j,kj,kj,k的祖先,二是i,j,ki,j,ki,j,k互相没有祖先关系

考虑dpdpdp,fi,jf_{i,j}fi,j​表示iii点的子树中与iii距离为jjj的点的个数,然后gi,jg_{i,j}gi,j​表示iii的子树中满足有多少个点(x,y)(x,y)(x,y)对使得dis(x,lca)=dis(y,lca)=dis(i,lca)+jdis(x,lca)=dis(y,lca)=dis(i,lca)+jdis(x,lca)=dis(y,lca)=dis(i,lca)+j。然后考虑统计答案
ans+=gy,i∗fx,i−1+gx,i+1∗fy,ians+=g_{y,i}*f_{x,i-1}+g_{x,i+1}*f_{y,i}ans+=gy,i​∗fx,i−1​+gx,i+1​∗fy,i​
然后考虑这个点对ggg的影响有
gx,i+1+=fx,i+1∗fy,ig_{x,i+1}+=f_{x,i+1}*f_{y,i}gx,i+1​+=fx,i+1​∗fy,i​
然后继承gx,i−1+=gy,i,fx,i+1+=fy,ig_{x,i-1}+=g_{y,i},f_{x,i+1}+=f_{y,i}gx,i−1​+=gy,i​,fx,i+1​+=fy,i​

然后可以长链剖分进行优化,fff在长链上向后运动,但是ggg是向前运动的。

考虑结点111,因为每次向前运动要放在len1len_1len1​的位置,但是该位置向后又要储存len1len_1len1​个值,所以我们要开两倍的空间

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


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=4e5+10;
struct node{ll to,next;
}a[N*2];
ll n,tot,ans,ls[N],son[N];
ll len[N],buff[N*2],bufg[N*2];
ll *f[N*2],*g[N*2],*nowf,*nowg;
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(ll x,ll fa){for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa)continue;dfs(y,x);if(len[y]>len[son[x]])son[x]=y;}len[x]=len[son[x]]+1;return;
}
void solve(ll x,ll fa){f[x][0]=1;if(son[x]){f[son[x]]=f[x]+1;g[son[x]]=g[x]-1;solve(son[x],x);}ans+=g[x][0];for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==son[x]||y==fa)continue;f[y]=nowf;nowf+=len[y];nowg+=len[y]*2+10;g[y]=nowg++;solve(y,x);for(ll j=0;j<len[y];j++){if(j)ans+=g[y][j]*f[x][j-1];ans+=g[x][j+1]*f[y][j];}for(ll j=0;j<len[y];j++){g[x][j+1]+=f[y][j]*f[x][j+1];if(j)g[x][j-1]+=g[y][j];f[x][j+1]+=f[y][j];}}return;
}
int main()
{scanf("%lld",&n);for(ll i=1;i<n;i++){ll x,y;scanf("%lld%lld",&x,&y);addl(x,y);addl(y,x);}dfs(1,1);nowf=buff;nowg=bufg;nowf+=len[1];nowg+=len[1]*2+10;f[1]=buff;g[1]=nowg++;solve(1,1);printf("%lld",ans);
}

P5904-[POI2014]HOT-Hotels加强版【长链剖分,dp】相关推荐

  1. 【BZOJ】4543: [POI2014]Hotel加强版-长链剖分DP

    传送门:bzoj4543 题解 三点两两距离相等的情况如下图: 设 f [ i ] [ j ] f[i][j] f[i][j]表示 i i i子树中与 i i i距离为 j j j(相对深度为 j j ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. 树链剖分之长链剖分 详解 题目整理

    树链剖分 题目中出现的树链剖分一般分为两种,重链剖分和长链剖分 重链剖分:选择子树最大的儿子, 将其归入当前点所在 的同一条重链 长链剖分:选择向下能达到的深 度最深的儿子,将其归 入当前点所在的同一 ...

  9. Bzoj4016/洛谷P2993 [FJOI2014] 最短路径树问题(最短路径问题+长链剖分/点分治)

    题面 Bzoj 洛谷 题解 首先把最短路径树建出来(用\(Dijkstra\),没试过\(SPFA\)\(\leftarrow\)它死了),然后问题就变成了一个关于深度的问题,可以用长链剖分做,所以我 ...

最新文章

  1. eureka需要替换吗_iOS第三方库Eureka实现定制动画详解(二):万变不离其宗-Row组件...
  2. 熟悉交换机与路由器组网(图解)
  3. Linux Kernel TCP/IP Stack — 协议栈收包处理流程
  4. 单片机中断机制对日常生活的启示_单片机原理部分课后习题解
  5. SAP CRM WebClient UI上以html格式显示note的问题讨论
  6. Marketing Cloud tile的semantic信息
  7. 13万字详细分析JDK中Stream的实现原理
  8. Linux之fgrep命令
  9. kibana从入门到精通-Kibana配置详解
  10. 迅雷手机版苹果版_「9月22日」最新 苹果IOS手机迅雷Beta版证书修复版 安卓不限速...
  11. spring boot添加redis过期策略
  12. 九位皇子对于皇帝的宝座争斗不休,那么是哪九位呢?
  13. 如何建设网站才有利于网站优化
  14. 关于增量模型和迭代模型的区别
  15. 3D游戏的碰撞检测是如何实现的?
  16. python多个函数_请教:一个类中可以定义多个同名函数?
  17. 小学计算机画线反思,会画画的线活动反思
  18. 《Adobe InDesign CS5中文版经典教程》—第1课1.2节工作区简介
  19. python计算椭球面积代码_使用ArcPy如何计算面图层的椭球面积?
  20. 结构体的大小如何计算

热门文章

  1. matlab如何求矩阵的转置矩阵,怎么用MATLAB程序求转置矩阵?急需,高手帮忙………………...
  2. bytecode java_Java 字节码解读
  3. android mvvm流程图,MVVM框架模式详解
  4. 怎么把c语言转换汇编程序,如何把汇编语言转换成C语言
  5. mysql 命令 g_MySQL命令行的几个用法
  6. html点击图片弹出大图特效代码,Jquery 点击图片在弹出层显示大图
  7. mybatis plus 批量保存_mybatis源码分析
  8. 台电x80plus装linux,纤巧却不简单——台电X80 Plus评测
  9. 7-1 字母统计图 (10 分)(思路+详解)
  10. [mybatis]映射文件_参数处理_#和$取值区别