BZOJ4543 [POI2014]Hotel加强版
Hotel加强版
有一个树形结构,每条边的长度相同,任意两个节点可以相互到达。选3个点。两两距离相等。有多少种方案?
数据范围:n<=100000
yyb的题解
我们先考虑一个\(O(n^2)\)的dp,也就是原题的做法。
我们考虑一下,三个点两两的距离相同是什么情况,
存在一个三个点公共的LCA,所以我们在LCA统计答案即可。
存在一个点,使得这个点到另外两个子树中距离它为d的点以及这个点的d次祖先。
所以,设计DP状态为
\(f[i][j]\)表示以\(i\)为根的子树中,距离当前点为\(j\)的点数。
\(g[i][j]\)表示以\(i\)为根的子树中,两个点到LCA的距离为\(d\),并且他们的LCA到\(i\)的距离为\(d−j\)的点对数,简单来说就是\(i\)往其他地方走\(j\)步就能找到一组解。
考虑合并的时候的转移:
\]
转移的正确性比较显然,不在多讲了,并不是这里的重点。这样子的复杂度是\(O(n^2)\)的。
我们观察一下转移的时候有这样两步:
\]
如果我们钦定一个儿子的话,那么这个数组是可以直接赋值的,并不需要再重复计算。
所以我们用指针来写,也就是:\(f[i]=f[son]−1,g[i]=g[son]+1\)。
如果整棵树是链我们发现复杂度可以做到O(n),既然如此,我们推广到树。我们进行长链剖分,每次钦定从重儿子直接转移,那么我们还需要从轻儿子进行转移。不难证明所有轻儿子都是一条重链的顶部,转移时的复杂度是重链长度。
那么,复杂度拆分成两个部分:直接从重儿子转移\(O(1)\),从轻儿子转移\(O(∑len)\)。发现每个点有且仅有一个父亲,因此一条重链算且仅被一个点暴力转移,而每次转移复杂度是链长。所以全局复杂度是∑链长,也就是\(O(n)\),因此总复杂度就是\(O(n)\)。
这样子写下来,发现长链剖分之后,我们的复杂度变为了线性。但是注意到复杂度证明中的一点:转移和链长相关。而链长和什么相关呢?深度。所以说对于这一类与深度相关的、可以快速合并的信息,使用长链剖分可以优化到一个非常完美的复杂度。如果需要维护的与深度无关的信息的话,或许dsu on tree是一个更好的选择。
代码
DP是的for是在用相对深度,比较简单的实现方法是之前统计重儿子的时候用高度代替深度。
然后tmp必须开到4倍是因为g数组指针给儿子的时候在前移。
co int N=1e5+1;
int n,head[N],to[N*2],nx[N*2],tot;
void add(int x,int y){to[++tot]=y,nx[tot]=head[x],head[x]=tot;}
int dep[N],md[N],son[N];
void dfs1(int x,int fa){
for(int i=head[x];i;i=nx[i]){
int y=to[i];if(y==fa) continue;
dfs1(y,x),md[x]=std::max(md[x],md[y]);
if(md[y]>md[son[x]]) son[x]=y;
}
md[x]=md[son[x]]+1;
}
ll*f[N],*g[N],tmp[N*4],*id=tmp,ans;
void dfs2(int x,int fa){
if(son[x]) f[son[x]]=f[x]+1,g[son[x]]=g[x]-1,dfs2(son[x],x);
f[x][0]=1,ans+=g[x][0];
for(int i=head[x];i;i=nx[i]){
int y=to[i]; if(y==fa||y==son[x]) continue;
f[y]=id,id+=md[y]*2,g[y]=id,id+=md[y]*2;
dfs2(y,x);
for(int j=0;j<md[y];++j){
if(j)ans+=f[x][j-1]*g[y][j];
ans+=g[x][j+1]*f[y][j];
}
for(int j=0;j<md[y];++j){
g[x][j+1]+=f[x][j+1]*f[y][j];
if(j)g[x][j-1]+=g[y][j];
f[x][j+1]+=f[y][j];
}
}
}
int main(){
// freopen("BZOJ4543.in","r",stdin);
// freopen(".out","w",stdout);
read(n);
for(int i=1,x,y;i<n;++i){
read(x),read(y);
add(x,y),add(y,x);
}
dfs1(1,0);
f[1]=id,id+=md[1]*2,g[1]=id,id+=md[1]*2;
dfs2(1,0);
printf("%lld\n",ans);
return 0;
}
BZOJ4543 [POI2014]Hotel加强版的更多相关文章
- 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 ...
- bzoj4543 [POI2014]Hotel加强版 长链剖分+树形DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4543 题解 这道题的弱化版 bzoj3522 [POI2014]Hotel 的做法有好几种吧. ...
- BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP
题意参见BZOJ3522 n<=100000 数据范围增强了,显然之前的转移方程不行了,那么不妨换一种. 因为不能枚举根来换根DP,那么我们描述的DP方程每个点要计算三个点都在这个点的子树内的方 ...
- 2019.01.08 bzoj4543: [POI2014]Hotel加强版(长链剖分+dp)
传送门 代码: 长链剖分好题. 题意:给你一棵树,问树上选三个互不相同的节点,使得这个三个点两两之间距离相等的方案数. 思路: 先考虑dpdpdp. fi,jf_{i,j}fi,j表示iii子树中离 ...
- 【BZOJ4543】[POI2014]Hotel加强版 长链剖分+DP
[BZOJ4543][POI2014]Hotel加强版 Description 同OJ3522数据范围:n<=100000 Sample Input 7 1 2 5 7 2 5 2 3 5 6 ...
- 【BZOJ4543】Hotel加强版(长链剖分)
[BZOJ4543]Hotel加强版(长链剖分) 题面 BZOJ,没有题面 洛谷,只是普通版本 题解 原来我们的\(O(n^2)\)做法是设\(f[i][j]\)表示以\(i\)为根的子树中,距离\( ...
- 4543: [POI2014]Hotel加强版
4543: [POI2014]Hotel加强版 链接 分析: f[u][i]表示子树u内,距离u为i的点的个数,g[u][i]表示在子树u内,已经选了两个深度一样的点,还需要在距离u为i的一个点作为第 ...
- 【BZOJ4543】Hotel加强版
[BZOJ4543]Hotel加强版 题面 bzoj 洛谷 $ps:$在洛谷看题在bzoj交... 题解 我们分析一下这个问题,要怎么样的点才满足三点距离两两相等呢? 1.存在三个点有共同的$LCA$ ...
- bzoj4543[POI2014]Hotel
题目链接 bzoj4543 [POI2014]Hotel 题解 这不是裸地点分嘛 ,我真傻,真的 n^2 这不是是sb题,~滑稽 ~ 枚举点转换为无根树,暴力子树中点的深度 计数转移 令a b c d ...
随机推荐
- 在Eclipse中快速添加main方法
方法一: 在创建类时自动添加,勾选“public static void main(String[] args)” 方法二: 输入main之后按"alt+/"组合键,选择如图所 ...
- spring mvc: log4j插件 log日志的输出
准备: log插件:log4j <!-- log日志插件 --> <!-- https://mvnrepository.com/artifact/log4j/log4j --> ...
- Ghost:一款简约风格博客系统
前言 本文将介绍一种最快速的创建Ghost博客系统的方法,并实现绑定二级域名到该博客系统.本文以本博客的“微博客”为例. 一键创建Ghost博客系统 Kite 是 Ghost 博客托管商,网址为:ht ...
- 【转】VIM 中设置Tab
灵活操作 Vim 中的 Tabsgaleki post @ 2007年11月16日 05:07PM in Vim Tips with tags: vim tabs Vim 支持 Tabs,也就是标签页 ...
- Android--------工具类StatusBarUtil实现完美状态栏
很早就想写这篇博客了,直到前几天有人问我这方面的问题才想起. 沉浸式状态栏是从android Kitkat(Android 4.4)开始出现的,顶部状态栏的颜色可以根据开发需求改变,使得APP风格更加 ...
- MySQL设置某一字段默认为0,但是插入数据化却显示为null
1.MySQL字段默认的含义:在插入时不指定该字段的值:2.以mybatis举例,如果是插入实体,那么为空的字段就会插入空:3.如果不想mybatis等持久化工具插入空,可以尝试insertSelec ...
- 河南省多校联盟二-F 线段树+矩阵
---恢复内容开始--- 1284: SP教数学 时间限制: 2 秒 内存限制: 128 MB提交: 24 解决: 4 题目描述 输入 输出 对于每组数据的2操作,输出一行对1e9 + 7取模的答 ...
- VMware虚拟机安装linux7并设置网络
1.下载VMware虚拟机 https://www.vmware.com/cn/products/workstation/workstation-evaluation.html 永久激活12位序列号: ...
- es6 nodejs compose
const compose = (...fns) => { let len = fns.length; let fn_index = len - 1; let fn_result; functi ...
- 伪基站,卒于5G——本质上是基于网络和UE辅助的伪基站检测,就是将相邻基站的CI、信号强度等信息通过测量报告上报给网络,网络结合网络拓扑、配置信息等相关数据,对所有数据进行综合分析,确认在某个区域中是否存在伪基站
伪基站,卒于5G from:https://www.huxiu.com/article/251252.html?h_s=h8 2018-07-05 21:58收藏27评论6社交通讯 本文来自微 ...