BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP
题意参见BZOJ3522
n<=100000
数据范围增强了,显然之前的转移方程不行了,那么不妨换一种。
因为不能枚举根来换根DP,那么我们描述的DP方程每个点要计算三个点都在这个点的子树内的方案数。
设f[i][j]表示i节点子树中与i距离为j的点的个数.
g[i][j]表示i节点子树中有g[i][j]对点满足每对点距离他们lca的距离都是d,他们lca距离i节点为d-j
也就是说现在已经找到两个节点了,需要再在没遍历的i的子树中找到一个距离i为j的点。
那么很容易得到转移方程:
ans+=f[x][j-1]*g[to[i]][j]
ans+=g[x][j+1]*f[to[i]][j]
g[x][j+1]+=f[to[i]][j]*f[x][j+1]
g[x][j-1]+=g[to[i]][j]
f[x][j+1]+=f[to[i]][j]
发现这个DP是合并深度信息转移的,而且子树信息被合并后就没用了,因此可以用长链剖分优化,每次继承重儿子信息,暴力合并其他子树。
因为父节点的f和g数组只由重儿子左移一位或右移一位得到,因此O(1)指针优化就好了。
具体应用到的长链剖分参见长链剖分
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n;
int x,y;
int tot;
ll s[1000010];
int head[100010];
int to[200010];
int mx[100010];
int next[200010];
int son[100010];
int fa[100010];
ll ans;
ll *now=s+1;
ll *f[100010];
ll *g[100010];
void add(int x,int y)
{
tot++;
next[tot]=head[x];
head[x]=tot;
to[tot]=y;
}
void dfs(int x)
{
mx[x]=0;
for(int i=head[x];i;i=next[i])
{
if(to[i]!=fa[x])
{
fa[to[i]]=x;
dfs(to[i]);
mx[x]=max(mx[to[i]]+1,mx[x]);
if(mx[to[i]]>mx[son[x]])
{
son[x]=to[i];
}
}
}
}
void dfs2(int x)
{
if(son[x])
{
f[son[x]]=f[x]+1;
g[son[x]]=g[x]-1;
dfs2(son[x]);
}
f[x][0]=1;
ans+=g[x][0];
for(int i=head[x];i;i=next[i])
{
if(to[i]!=fa[x]&&to[i]!=son[x])
{
f[to[i]]=now;
now+=mx[to[i]]+1;
g[to[i]]=now+mx[to[i]]+1;
now+=mx[to[i]]*2+2;
dfs2(to[i]);
for(int j=mx[to[i]];j>=0;j--)
{
if(j)
{
ans+=f[x][j-1]*g[to[i]][j];
}
ans+=g[x][j+1]*f[to[i]][j];
g[x][j+1]+=f[to[i]][j]*f[x][j+1];
}
for(int j=0;j<=mx[to[i]];j++)
{
if(j)
{
g[x][j-1]+=g[to[i]][j];
}
f[x][j+1]+=f[to[i]][j];
}
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
dfs(1);
f[1]=now;
now+=mx[1]+1;
g[1]=now+mx[1]+1;
now+=mx[1]*2+2;
dfs2(1);
printf("%lld",ans);
}
BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP的更多相关文章
- bzoj4543 [POI2014]Hotel加强版 长链剖分+树形DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4543 题解 这道题的弱化版 bzoj3522 [POI2014]Hotel 的做法有好几种吧. ...
- BZOJ.4543.[POI2014]Hotel加强版(长链剖分 树形DP)
题目链接 弱化版:https://www.cnblogs.com/SovietPower/p/8663817.html. 令\(f[x][i]\)表示\(x\)的子树中深度为\(i\)的点的个数,\( ...
- 【BZOJ4543】[POI2014]Hotel加强版 长链剖分+DP
[BZOJ4543][POI2014]Hotel加强版 Description 同OJ3522数据范围:n<=100000 Sample Input 7 1 2 5 7 2 5 2 3 5 6 ...
- BZOJ3522&4543 [POI2014]Hotel加强版 长链剖分
上上周见fc爷用长链剖分秒题 于是偷偷学一学 3522的数据范围很小 可以暴力枚举每个点作为根节点来dp 复杂度$O(n^2)$ 考虑令$f[x][j]$表示以$x$为根的子树内距离$x$为$j$的点 ...
- 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 ...
- 【CF1009F】Dominant Indices(长链剖分优化DP)
点此看题面 大致题意: 设\(d(x,y)\)表示\(x\)子树内到\(x\)距离为\(y\)的点的个数,对于每个\(x\),求满足\(d(x,y)\)最大的最小的\(y\). 暴力\(DP\) 首先 ...
- CF1009F Dominant Indices——长链剖分优化DP
原题链接 \(EDU\)出一道长链剖分优化\(dp\)裸题? 简化版题意 问你每个点的子树中与它距离为多少的点的数量最多,如果有多解,最小化距离 思路 方法1. 用\(dsu\ on\ tree\)做 ...
- 2019.01.08 bzoj4543: [POI2014]Hotel加强版(长链剖分+dp)
传送门 代码: 长链剖分好题. 题意:给你一棵树,问树上选三个互不相同的节点,使得这个三个点两两之间距离相等的方案数. 思路: 先考虑dpdpdp. fi,jf_{i,j}fi,j表示iii子树中离 ...
- BZOJ4543 [POI2014]Hotel加强版
题意 有一个树形结构,每条边的长度相同,任意两个节点可以相互到达.选3个点.两两距离相等.有多少种方案? 数据范围:n<=100000 分析 参照小蒟蒻yyb的博客. 我们先考虑一个\(O(n^ ...
随机推荐
- 跨域 XMLHttpRequest对象
XMLHttpRequest对象是ajax编程的基础,用于发送请求(数据)与服务端进行交互. 目前主流浏览器都内置了XMLHttpRequest对象. 浏览器会使用XMLHttpRequest对象来创 ...
- snmp对超过16T的磁盘大小识别不对的解决办法
https://blog.csdn.net/redleaf0000/article/details/38303299
- 记录一次因代理Controller产生的404问题
spring 3.2.4 为了给每一个controller配置一个拦截器链 import com.google.common.collect.Lists; import org.aopalliance ...
- [转] webpack3最新版本配置研究(五) devtool,webpack-dev-server,CommonsChunkPlugin
devtool devtool是webpack中config自带的属性只要使用就可以了不用安装 webpack官网的解释如下 当 webpack 打包源代码时,可能会很难追踪到错误和警告在源代码中的原 ...
- [转] 组件库按需加载 借助babel-plugin-import实现
前段时间一直在基于webpack进行前端资源包的瘦身.在项目中基于路由进行代码分离,http://www.cnblogs.com/legu/p/7251562.html.对于公司内部的组件库,所有内容 ...
- order by 导出数据不一致的问题
转自 http://blog.csdn.net/wwwwei_csdn/article/details/78181197 前言 数据库分页是后台经常要使用的技术手段,有时候进行数据库查询会根据业务 ...
- cqoi2018
题解: 很多模板题 第一次写莫队还比较顺利 除了把排序的cmp写错..(还第一次遇到) 这题分块也可以 先预处理出g[i][j]代表前i个块,颜色为j的有多少种 f[i][j]表示i-j的块能构成多少 ...
- python之多线程 queue 实践 筛选有效url
0.目录 1.背景 某号码卡申请页面通过省份+城市切换归属地,每次返回10个号码. 通过 Fiddler 抓包确认 url 关键参数规律: provinceCode 两位数字 cityCode 三位数 ...
- tasksetCPU亲和力&docke容器资源限制
[taskset详解] taskset设置cpu亲和力,taskset能够将一个或者多个进程绑定到一个或者多个处理器上运行 参数: 选项: -a, --all-tasks 在给定 pid 的所有任务( ...
- springmvc基础使用配置
前言 本案例是在idea编辑器下,maven管理项目的前提下. 步骤 1.新建maven项目 2.配置web.xml <?xml version="1.0" encoding ...