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 5
Sample Output
5
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define N 100010
LL pool[N<<4];
LL* top=pool;
LL* get(int len){LL* t=top;top+=len;return t;}
LL *f[N],*g[N];
int n;
LL ans=0;
vector<int> p[N];
int dep[N],lson[N];
void dfs1(int u,int fa){dep[u]=0;lson[u]=0;for(int i=0;i<p[u].size();i++){int v=p[u][i];if(v==fa)continue;dfs1(v,u);dep[u]=max(dep[u],dep[v]+1);if(dep[v]>dep[lson[u]])lson[u]=v;}
}
void dfs2(int u,int fa,int& maxlen,int blank){maxlen=max(maxlen,dep[u]);if(lson[u]){dfs2(lson[u],u,maxlen,blank+1);ans+=g[lson[u]][1];f[u]=f[lson[u]]-1;f[u][0]=1;g[u]=g[lson[u]]+1;}else{f[u]=get(maxlen+5+blank)+blank;g[u]=get(maxlen+5+blank);f[u][0]=1;}for(int i=0;i<p[u].size();i++){int v=p[u][i],mxlen=0;if(v==fa||v==lson[u])continue;dfs2(v,u,mxlen,0);for(int j=0;j<dep[v];j++)ans+=f[u][j]*g[v][j+1];for(int j=1;j<=dep[v]+1;j++)ans+=g[u][j]*f[v][j-1];for(int j=1;j<=dep[v]+1;j++)g[u][j]+=f[u][j]*f[v][j-1];for(int j=0;j<=dep[v];j++)f[u][j+1]+=f[v][j];for(int j=1;j<=dep[v];j++)g[u][j-1]+=g[v][j];}
}
int main(){scanf("%d",&n);for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);p[u].push_back(v);p[v].push_back(u);}int mxlen=0;dfs1(1,0);dfs2(1,0,mxlen,0);printf("%lld",ans);return 0;
}
转载于:https://www.cnblogs.com/dream-maker-yk/p/9676294.html
BZOJ4543 POI2014 Hotel加强版 【长链剖分】【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 ...
- bzoj4543. [POI2014]Hotel加强版
bzoj4543. [POI2014]Hotel加强版 题面描述 Solution 先看n≤5e3n \leq 5e3n≤5e3怎么做. 考虑树形dpdpdp. 设f[i][j]f[i][j]f[i] ...
- 【BZOJ4543】Hotel加强版【神仙树形dp】【长链剖分】
题意:给一棵 nnn 个点的树,求两两距离相等的三元组个数. n≤105n\leq 10^5n≤105 显然相当于是找一个点到这三个点距离相等.子树内和子树外到当前点的距离为某个值的点的个数可以长链剖 ...
- P5904-[POI2014]HOT-Hotels加强版【长链剖分,dp】
正题 题目链接:https://www.luogu.com.cn/problem/P5904 题目大意 nnn个点的一棵树,求有多少个点对(i,j,k)(i,j,k)(i,j,k)使得这三个点距离相等 ...
- 【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存在下面两种情况 某个点三个子树(保证该点 ...
最新文章
- OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法...
- Android小项目之---选择对话框(附源码)
- golang中的base64
- 由浅至深,谈谈.NET混淆原理 -- 五(MaxtoCode原理),六(其它保护方法)
- Use Cases in an Agile Backlog
- 年过35岁的程序员都去哪了?一张图道尽老程序员们的花样出路
- 360浏览器打不开微信的连接服务器,上午还能打开,下午360浏览器打不开微信公 – 手机爱问...
- Confirm的用法!
- Linux 使用sigaction查询或设置信号处理方式
- Principle of Computing (Python)学习笔记(7) DFS Search + Tic Tac Toe use MiniMax Stratedy
- 数据科学家常见的5个SQL面试问题
- Mybatis判断int类型是否为空
- 绿联扩展坞拆解_拆解报告:UGREEN绿联3A1C四口多功能扩展坞(带SD卡槽版)
- HDU 1081 To The Max
- 喜马拉雅下载文件名批量修改
- 分享几款PR常用插件
- java自动化测试面试题_自动化测试面试题
- 08CMS之数据库操作
- java操作mysql视图_MySQL使用视图
- Magicodes.IE在.NET Core中通过请求头导出多种格式文件