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;
}

BZOJ4543 POI2014 Hotel加强版 【长链剖分】【DP】*的更多相关文章

  1. 【BZOJ4543】[POI2014]Hotel加强版 长链剖分+DP

    [BZOJ4543][POI2014]Hotel加强版 Description 同OJ3522数据范围:n<=100000 Sample Input 7 1 2 5 7 2 5 2 3 5 6 ...

  2. bzoj4543 [POI2014]Hotel加强版 长链剖分+树形DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4543 题解 这道题的弱化版 bzoj3522 [POI2014]Hotel 的做法有好几种吧. ...

  3. BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP

    题意参见BZOJ3522 n<=100000 数据范围增强了,显然之前的转移方程不行了,那么不妨换一种. 因为不能枚举根来换根DP,那么我们描述的DP方程每个点要计算三个点都在这个点的子树内的方 ...

  4. BZOJ.4543.[POI2014]Hotel加强版(长链剖分 树形DP)

    题目链接 弱化版:https://www.cnblogs.com/SovietPower/p/8663817.html. 令\(f[x][i]\)表示\(x\)的子树中深度为\(i\)的点的个数,\( ...

  5. BZOJ3522&4543 [POI2014]Hotel加强版 长链剖分

    上上周见fc爷用长链剖分秒题 于是偷偷学一学 3522的数据范围很小 可以暴力枚举每个点作为根节点来dp 复杂度$O(n^2)$ 考虑令$f[x][j]$表示以$x$为根的子树内距离$x$为$j$的点 ...

  6. 2019.01.08 bzoj4543: [POI2014]Hotel加强版(长链剖分+dp)

    传送门 代码: 长链剖分好题. 题意:给你一棵树,问树上选三个互不相同的节点,使得这个三个点两两之间距离相等的方案数. 思路: 先考虑dpdpdp. fi,jf_{i,j}fi,j​表示iii子树中离 ...

  7. BZOJ4543 [POI2014]Hotel加强版

    题意 有一个树形结构,每条边的长度相同,任意两个节点可以相互到达.选3个点.两两距离相等.有多少种方案? 数据范围:n<=100000 分析 参照小蒟蒻yyb的博客. 我们先考虑一个\(O(n^ ...

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

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

  9. bzoj 3522 / 4543 [POI 2014] Hotel - 动态规划 - 长链剖分

    题目传送门 bzoj 3522 需要root权限的传送点 bzoj 4543 快速的传送点 慢速的传送点 题目大意 给定一棵树,问有多少个无序三元组$(x, y, z)$使得这三个不同点在树上两两距离 ...

随机推荐

  1. LA 5713 秦始皇修路

    https://vjudge.net/problem/UVALive-5713 题意: 秦朝有n个城市,需要修建一些道路使得任意两个城市之间都可以连通.道士徐福声称他可以用法术修路,不花钱,也不用劳动 ...

  2. HttpGet/HttpPost请求方法

    /// <summary> /// HttpGet请求 /// </summary> /// <param name="url">HttpGet ...

  3. mysql数据库开放远程连接的方法

    web与mysql数据库分离开来是一个不错的选择,避免因为大量的数据库查询占用CPU而使web资源不足,同时可以使web服务器的资源尽最大的提供浏览服务,而数据库服务器单独的只处理数据库事物. 适用范 ...

  4. C++(三十一) — 静态成员变量、静态成员函数

    1.静态成员变量 类的静态成员变量是,由该类的所以对象共同维护和使用的数据成员,每个类只有一个副本,是类数据成员的一种特例.采用 static 关键字声明. 目的:实现同一类中不同对象之间的数据共享. ...

  5. java 判断一个字符串中的数字:是否为数字、是否包含数字、截取数字

    题外话: JavaScript中判断一个字符是否为数字,用函数:isDigit(); 一.判断一个字符串是否都为数字 package com.cmc.util; import java.util.re ...

  6. 第九天 1-8 RHEL7软件包管理

    在RHEL7中,主要有 RPM 和 YUM 两种包管理 1.RPM包管理--使用rpm命令对rpm软件包进行管理rpm命令格式:[有很多,自己可以man一下,这里只列举一下常用的]rpm -ivh [ ...

  7. 【Windows】Python脚本随机启动

    Python脚本的管理在linux系统上市非常方便的,在windows则不是很方面.但是由于之前对于Windows这块的内容不是很了解,其实计划任务也是不错的,但和linux相比起来还是欠缺了那么点. ...

  8. 【hive】子查询

    hive中是不支持子查询的 但是并不意味这不支持in 或者 not in in 或者not in 后边是定值的话是支持的 但是接定制是可以的 例如 select id from table not i ...

  9. 小练习:补数 (Number Complement)

    1.eamples Input: Output: Explanation: The binary representation of (no leading zero bits), and its c ...

  10. DataTable RowFilter 过滤数据

    用Rowfilter加入过滤条件 eg: string sql = "select Name,Age,Sex from UserInfo"; DataTable dt = Data ...