P3565 [POI2014] HOT-Hotels

~~~~~ P3565 POI2014 HOT-Hotels ~~~~~ 总题单链接

思路

~~~~~ 设 g u i gui gui 表示在 u u u 的子树内,距离 u u u 为 i i i 的点的个数。

~~~~~ 设 d p u i dpui dpui 表示: u u u 的子树内存在两个点 x , y x,y x,y,设 d i s ( x , l c a ) = d i s ( y , l c a ) = d dis(x,lca)=dis(y,lca)=d dis(x,lca)=dis(y,lca)=d, d i s ( l c a , u ) = k dis(lca,u)=k dis(lca,u)=k, i = d − k i=d-k i=d−k。举个栗子:


~~~~~ 上图中 d p 1 1 = 3 dp11=3 dp11=3({x=4,y=5},{x=4,y=8},{x=6,y=8})。

~~~~~ 对于每个 u u u:

~~~~~ a n s = a n s + d p u 0 ans=ans+dpu0 ans=ans+dpu0

~~~~~ a n s = a n s + ∑ x , y ∈ s o n ( u ) , x ! = y d p x j + 1 ∗ g y j − 1 ans=ans+\sum_{x,y\in son(u),x!=y}dpxj+1*gyj-1 ans=ans+∑x,y∈son(u),x!=ydpxj+1∗gyj−1,为什么是 j + 1 j+1 j+1 和 j − 1 j-1 j−1?因为 u u u 和 y y y 已经补了两个,不懂的同学可以画个图看一下。

~~~~~ d p u i = d p u i + g x i − 1 ∗ g y i − 1 dpui =dpui+gxi-1*gyi-1 dpui=dpui+gxi−1∗gyi−1,这是 k = 0 k=0 k=0 的情况。

~~~~~ d p u i = d p u i + d p v i − 1 dpui=dpui+dpvi-1 dpui=dpui+dpvi−1

~~~~~ 以上公式可以用前缀和做到 O ( N ) O(N) O(N) 转移。

~~~~~ 时间复杂度 O ( N 2 ) O(N^2) O(N2),空间复杂度 O ( N 2 ) O(N^2) O(N2)。

~~~~~ 发现这道题可以用长链剖分将时间复杂度优化至 O ( N ) O(N) O(N),但这个以后再将。

代码

cpp 复制代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;ll ans;vector<int>eg[5002];
int f[5002][5002],g[5002][5002];
inline void dfs(int fa,int p)
{
	f[p][0]=1;
	for(int v:eg[p]) {
		if(v==fa)continue;
		dfs(p,v);
		for(int i=0;i<=n;i++)ans+=g[p][i]*(i==0?0:f[v][i-1])+g[v][i+1]*f[p][i];
		for(int i=0;i<=n;i++)g[p][i]+=f[p][i]*(i==0?0:f[v][i-1])+g[v][i+1];
		for(int i=1;i<=n;i++)f[p][i]+=f[v][i-1];
	}
}
signed main(){
	
	cin>>n;
	for(int i=1;i<n;i++) {
		int u,v;cin>>u>>v;
		eg[u].push_back(v);
		eg[v].push_back(u);
	}
	
	dfs(0,1);
	cout<<ans;
	
	return 0;
}
相关推荐
王老师青少年编程18 分钟前
2026年全国青少年信息素养大赛复赛真题(算法应用主题赛C++初中组:带解析)(7月11日试卷一)【文末附答案和解析】
c++·真题·答案·复赛·2026年·青少年信息素养大赛·算法应用主题赛
Hesionberger32 分钟前
动态规划与二分法破解最长递增子序列
java·数据结构·python·算法·leetcode
imuliuliang1 小时前
关于Kruskal 算法在图优化问题中的扩展应用7
算法
大阿明1 小时前
C++智能指针与RAII机制精讲:彻底根治内存泄漏与野指针
java·jvm·c++
一生了无挂1 小时前
C++面向对象核心精讲:类、对象、封装、权限与生命周期全解析
java·jvm·c++
aaPIXa6221 小时前
C++ 用 Claude Code 的 defending-code-reference-harness:C/C++ 内存漏洞自动发现与修复 Pipeline
java·c语言·c++
郝学胜-神的一滴1 小时前
[简化版 GAMES 101] 计算机图形学 17:纹理技术从基础原理到多场景实战应用
c++·unity·游戏引擎·图形渲染·three.js·opengl·unreal
老约家的可汗1 小时前
Linux中基础IO
linux·服务器·算法
满怀冰雪1 小时前
第29篇-状态压缩DP-当状态很多时如何降维优化
java·算法·动态规划
令狐掌门1 小时前
2026华为OD面试题020:日志文件异常检测
算法·leetcode·华为od