P5904-[POI2014]HOT-Hotels加强版【长链剖分,dp】
正题
题目链接: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】相关推荐
- 【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 ...
- 【CF1009F】 Dominant Indices (长链剖分+DP)
题目链接 \(O(n^2)\)的\(DP\)很容易想,\(f[u][i]\)表示在\(u\)的子树中距离\(u\)为\(i\)的点的个数,则\(f[u][i]=\sum f[v][i-1]\) 长链剖 ...
- P7581-「RdOI R2」路径权值【长链剖分,dp】
正题 题目链接:https://www.luogu.com.cn/problem/P7581 题目大意 给出nnn个点的有边权有根树,mmm次询问一个节点xxx的所有kkk级儿子两两之间路径长度. 1 ...
- BZOJ4543/BZOJ3522 [POI2014]Hotel加强版(长链剖分)
题目好神仙--这个叫长链剖分的玩意儿更神仙-- 考虑dp,设\(f[i][j]\)表示以\(i\)为根的子树中到\(i\)的距离为\(j\)的点的个数,\(g[i][j]\)表示\(i\)的子树中有\ ...
- 【BZOJ4543】【POI2014】Hotel加强版(长链剖分)
传送门 题意:求树上满足三点之间距离两两相等的三元组个数 n≤1e5n\le 1e5n≤1e5 原题数据是n≤5000n\le5000n≤5000 考虑怎么做 f[u][i]f[u][i]f[u][i ...
- P3565 [POI2014]HOT-Hotels(树形dp+长链剖分)
P3565 [POI2014]HOT-Hotels 参考题解 题目大意: 给定一棵树,在树上选 3 个点,要求两两距离相等,求方案数. 三个点树上两两距离为d存在下面两种情况 某个点三个子树(保证该点 ...
- 【BZOJ4543】Hotel加强版【神仙树形dp】【长链剖分】
题意:给一棵 nnn 个点的树,求两两距离相等的三元组个数. n≤105n\leq 10^5n≤105 显然相当于是找一个点到这三个点距离相等.子树内和子树外到当前点的距离为某个值的点的个数可以长链剖 ...
- 树链剖分之长链剖分 详解 题目整理
树链剖分 题目中出现的树链剖分一般分为两种,重链剖分和长链剖分 重链剖分:选择子树最大的儿子, 将其归入当前点所在 的同一条重链 长链剖分:选择向下能达到的深 度最深的儿子,将其归 入当前点所在的同一 ...
- Bzoj4016/洛谷P2993 [FJOI2014] 最短路径树问题(最短路径问题+长链剖分/点分治)
题面 Bzoj 洛谷 题解 首先把最短路径树建出来(用\(Dijkstra\),没试过\(SPFA\)\(\leftarrow\)它死了),然后问题就变成了一个关于深度的问题,可以用长链剖分做,所以我 ...
最新文章
- eureka需要替换吗_iOS第三方库Eureka实现定制动画详解(二):万变不离其宗-Row组件...
- 熟悉交换机与路由器组网(图解)
- Linux Kernel TCP/IP Stack — 协议栈收包处理流程
- 单片机中断机制对日常生活的启示_单片机原理部分课后习题解
- SAP CRM WebClient UI上以html格式显示note的问题讨论
- Marketing Cloud tile的semantic信息
- 13万字详细分析JDK中Stream的实现原理
- Linux之fgrep命令
- kibana从入门到精通-Kibana配置详解
- 迅雷手机版苹果版_「9月22日」最新 苹果IOS手机迅雷Beta版证书修复版 安卓不限速...
- spring boot添加redis过期策略
- 九位皇子对于皇帝的宝座争斗不休,那么是哪九位呢?
- 如何建设网站才有利于网站优化
- 关于增量模型和迭代模型的区别
- 3D游戏的碰撞检测是如何实现的?
- python多个函数_请教:一个类中可以定义多个同名函数?
- 小学计算机画线反思,会画画的线活动反思
- 《Adobe InDesign CS5中文版经典教程》—第1课1.2节工作区简介
- python计算椭球面积代码_使用ArcPy如何计算面图层的椭球面积?
- 结构体的大小如何计算
热门文章
- matlab如何求矩阵的转置矩阵,怎么用MATLAB程序求转置矩阵?急需,高手帮忙………………...
- bytecode java_Java 字节码解读
- android mvvm流程图,MVVM框架模式详解
- 怎么把c语言转换汇编程序,如何把汇编语言转换成C语言
- mysql 命令 g_MySQL命令行的几个用法
- html点击图片弹出大图特效代码,Jquery 点击图片在弹出层显示大图
- mybatis plus 批量保存_mybatis源码分析
- 台电x80plus装linux,纤巧却不简单——台电X80 Plus评测
- 7-1 字母统计图 (10 分)(思路+详解)
- [mybatis]映射文件_参数处理_#和$取值区别