当前位置: 首页 > news >正文

P3565 [POI2014] HOT-Hotels

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

思路

~~~~~       g [ u ] [ i ] g[u][i] g[u][i] 表示在 u u u 的子树内,距离 u u u i i i 的点的个数。

~~~~~       d p [ u ] [ i ] dp[u][i] dp[u][i] 表示: 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=dk。举个栗子:


~~~~~      上图中 d p [ 1 ] [ 1 ] = 3 dp[1][1]=3 dp[1][1]=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+dp[u][0] ans=ans+dp[u][0]

~~~~~       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}dp[x][j+1]*g[y][j-1] ans=ans+x,yson(u),x!=ydp[x][j+1]g[y][j1],为什么是 j + 1 j+1 j+1 j − 1 j-1 j1?因为 u u u y y y 已经补了两个,不懂的同学可以画个图看一下。

~~~~~       d p [ u ] [ i ] = d p [ u ] [ i ] + g [ x ] [ i − 1 ] ∗ g [ y ] [ i − 1 ] dp[u][i] =dp[u][i]+g[x][i-1]*g[y][i-1] dp[u][i]=dp[u][i]+g[x][i1]g[y][i1],这是 k = 0 k=0 k=0 的情况。

~~~~~       d p [ u ] [ i ] = d p [ u ] [ i ] + d p [ v ] [ i − 1 ] dp[u][i]=dp[u][i]+dp[v][i-1] dp[u][i]=dp[u][i]+dp[v][i1]

~~~~~      以上公式可以用前缀和做到 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),但这个以后再将。

代码

#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;
}
http://www.lryc.cn/news/433617.html

相关文章:

  • 设计模式 | 单例模式
  • Web安全之CSRF攻击详解与防护
  • IDEA运行Java程序提示“java: 警告: 源发行版 11 需要目标发行版 11”
  • 车载测试| 汽车的五域架构 (含线控技术知识)
  • 【Linux】gcc/g++ 、make/Makefile、git、gdb 的使用
  • Elastic Stack--ES的DSL语句查询
  • ARM基础知识---CPU---处理器
  • 将星 x17 安装ubuntu 20.04 双系统
  • E31.【C语言】练习:指针运算习题集(上)
  • git分支的管理
  • 对于消息队列的一些思考
  • IM即时通讯软件-WorkPlus私有化部署的局域网即时通讯工具
  • AI大模型的饕餮盛宴,系统学习大模型技术,你想要的书都在这里了
  • 支付宝开放平台-开发者社区——AI 日报「9 月 9 日」
  • 将AI与情境定位结合以确保品牌安全
  • OpenAI 联合 SWE 发布 AI 软件工程能力测试集,Gru.ai 荣登榜首
  • 一文读懂SpringMVC的工作原理
  • 【python-斐波那契数列和完美数之间的区别】
  • 【redis】本地windows五分钟快速安装redis
  • arm64高速缓存基础知识
  • 物管王 物业管理系统软件
  • YOLOv10改进:CA注意力机制【注意力系列篇】(附详细的修改步骤,以及代码,目标检测效果优于SE和CBAM注意力)
  • 使用go语言获取海南七星彩历史开奖记录并打印输出
  • 使用Spring Boot集成Spring Data JPA和单例模式构建库存管理系统
  • 记录ssl epoll的tcp socket服务端在客户端断开时崩溃的问题
  • ubuntu任何版本 卡死 解决办法
  • 算法-合并区间(56)
  • 港科夜闻 | 叶玉如校长出席2024科技+新质生产力高峰论坛发表专题演讲,贡献国家科技强国战略...
  • 一文读懂IPv6v6地址的配置方式
  • 【设计模式】设计模式的八大原则