Portal --> bzoj4543

Solution

​  一年前的题== 然而一年前我大概是在划水qwq

​​  其实感觉好像关键是。。设一个好的状态?然后。。你要用一种十分优秀的方式快乐转移qwq

​  

​​  首先是状态,我们设\(f[x][i]\)表示以\(x\)为根的子树中,与\(x\)的距离为\(i\)的节点数量,\(g[x][i]\)表示。。\(x\)子树内形如下图的点对\((a,b)\)(无序)的数量

​​  其中\(d\)是一个。。不确定的值(说白了就是所有的\(d\)都要考虑到),或者更加直白地说,只要在\(x\)节点上“接上”一条长度为\(i\)的边(边连着一个节点\(y\)),那么\(y,a,b\)可以构成一个满足题目要求的方案

​​  然后这个时候我们就可以快乐转移了,枚举\(x\)的后继\(u\):

\[\begin{aligned}
g[x][i]&+=f[x][i]*f[u][i-1]+g[u][i+1]\\
f[x][i]&+=f[u][i-1]\\
\end{aligned}
\]

​​  其中\(i\)的范围都是\(1\sim\)子树内的最大深度

​​  稍微解释一下\(g\)的转移:前面的乘法的话就是\(lca\)为\(x\)的情况,后面的话就是从子树中直接继承上来(注意\(+1\)的话是因为\(i\)是被减的那个量)

​​  接下来是答案的统计,考虑统计经过\(x\)的方案,我们有:

\[ans+=\sum\limits_{u\in son(x)}f[u][i-1]*g[x][i]+g[u][i]*f[x][i-1]
\]

​​  同样的\(i\)的范围也是\(1\sim\)子树内的最大深度

​​  那么这个时候可能会有疑问,接上去的那个点的连边不能是一个带“折”的边吗,为什么可以直接用不带折的\(f\)算呢?其实稍微画一下图:

​​  (注意图中的一条边。。可能是一条链只是我懒得画了qwq)我们会发现这种情况其实会在统计图中那个没有标号的节点的时候统计到(没有标号的节点的\(g\)中是可能包含了\((a,b)\)这种情况的(如果他们可能构成一种合法方案的话),然后这个时候\(y\)这个节点其实就是\(f\)中的一部分,所以如果可能构成合法方案的话是会被算进空白节点的贡献中的

​​  (所以说其实。。也不能够叫做统计经过\(x\)的方案的答案)

​  

​  然后现在的问题就是我们怎么快速转移

​​  发现那个\(i\)的变化很有规律,考虑当我们在树形dp中将第一个儿子的值拿来更新父亲的时候的情况,稍微写一下大概是这样:

\[\begin{aligned}
f[x][i]&=f[u][i-1]\\
g[x][i]&=g[u][i+1]\\
\end{aligned}
\]

​​  我们将\(f[x],g[x],f[u],g[u]\)都看成一个整体的话,\(f[u]\)到\(f[x]\)的转移其实相当于整体向前或向后偏移了一位,\(g[x]\)和\(g[u]\)的转移也是一样,所以我们其实可以用指针(或者。。下标偏移一下什么的,我的代码写的就是这个因为我不太会用指针qwq)来实现\(O(1)\)的转移

​​  然后对于后面的情况我们都要老老实实枚举\(i\),因此转移复杂度是跟\(u\)的子树最大深度相关的

​​  所以我们不妨考虑把子树最大深度最大的那个后继钦定为第一个后继,\(O(1)\)转移它的信息,然后其他的后继就\(O(dep)\)转移(其实就是长链剖分一下qwq把重儿子摆在一起),这样的话就能够做到整体复杂度\(O(n)\)了(证明的话我不是很会qwq网上看到dalao的博客中说的貌似是直接用深度相减算出一个点的转移的复杂度然后求一下和发现除了叶子节点以外的所有点的\(dep\)都被抵消了所以就是\(O(n)\)了)

​​  然后再稍微说一下下标偏移写法的实现:具体一点就是我们考虑将所有的\(f\)的值排成一排(\(g\)的值也是一样),像树链剖分中的线段树一样将一条长链中所有的节点的信息放在连续的一段,链上的转移的话\(f\)相当于每次往后移一位,\(g\)相当于每次往前移一位(因此在存的时候一条链预留的长度应该\(*2\),因为要预留往前移的空间)

​​  转移的时候一定要注意边界。。。

​  

​​  代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=5*(1e5)+10;
struct xxx{
int y,nxt;
}a[N*2];
int h[N],dep[N],top[N],mx[N],son[N],pre[N],pos[N];
int dfn[N];
ll f[N*10],g[N*10];
int n,m,tot,dfn_t,lis_pos;
ll ans;
void add(int x,int y){a[++tot].y=y; a[tot].nxt=h[x]; h[x]=tot;}
void dfs(int fa,int x,int d){
int u;
dep[x]=d; mx[x]=1;
pre[x]=fa; son[x]=0;
for (int i=h[x];i!=-1;i=a[i].nxt){
u=a[i].y;
if (u==fa) continue;
dfs(x,u,d+1);
mx[x]=max(mx[x],mx[u]+1);
if (mx[son[x]]<mx[u]+1) son[x]=u;
}
}
void dfs1(int fa,int x){
int u;
dfn[x]=++dfn_t;
if (son[x]){
top[son[x]]=top[x];
dfs1(x,son[x]);
}
for (int i=h[x];i!=-1;i=a[i].nxt){
u=a[i].y;
if (u==fa||u==son[x]) continue;
top[u]=u; pos[u]=lis_pos+mx[u];
lis_pos+=mx[u]*2;
dfs1(x,u);
}
}
int locf(int x,int i){return dfn[x]+i;}
int locg(int x,int i){return pos[top[x]]-(dep[x]-dep[top[x]])+i;}
int calc(int x,int u){
for (int i=1;i<=mx[u];++i)
ans+=f[locf(u,i-1)]*g[locg(x,i)];
for (int i=1;i<mx[u];++i)
ans+=g[locg(u,i)]*f[locf(x,i-1)];
for (int i=0;i<mx[u]-1;++i)
g[locg(x,i)]+=g[locg(u,i+1)];
for (int i=1;i<=mx[u];++i){
g[locg(x,i)]+=f[locf(x,i)]*f[locf(u,i-1)];
f[locf(x,i)]+=f[locf(u,i-1)];
}
}
void solve(int fa,int x){
int u;
if (!son[x]){
f[locf(x,0)]=1; g[locg(x,0)]=0;
return;
}
solve(x,son[x]);
g[locg(x,mx[x])]=g[locg(x,mx[x]-1)]=0;
ans+=g[locg(x,0)];
f[locf(x,0)]=1;
for (int i=h[x];i!=-1;i=a[i].nxt){
u=a[i].y;
if (u==fa||u==son[x]) continue;
solve(x,u);
calc(x,u);
}
}
void init(){
memset(h,-1,sizeof(h));
tot=0;
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
} int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int x,y;
while (1){
scanf("%d",&n);
if (!n) return 0;
init();
for (int i=1;i<n;++i){
scanf("%d%d",&x,&y);
add(x,y); add(y,x);
}
dfs(0,1,1);
dfn_t=0; lis_pos=0;
top[1]=1; pos[1]=lis_pos+mx[1];
lis_pos=mx[1]*2;
dfs1(0,1);
ans=0;
solve(0,1);
printf("%lld\n",ans);
}
}

【bzoj4543】Hotel加强版(thr)的更多相关文章

  1. BZOJ4543 Hotel加强版

    题面 $\text{BZOJ}$间接权限题 洛谷的弱化版 题解 三点距离两两相等要满足以下条件: 有一个相同的$\text{LCA}$ 所以如果存在一个点,使得另外两个点在它子树中,距离为$d$,且$ ...

  2. BZOJ4543 Hotel加强版(长链剖分)

    题意 求一棵树上,两两距离相等的三个点的三元组(无序)的个数. 题解 转自 CaptainHarryChen 的博客 CODE 代码中的f,gf,gf,g对应题解中的num,waynum,waynum ...

  3. 【BZOJ4543】Hotel加强版(长链剖分)

    [BZOJ4543]Hotel加强版(长链剖分) 题面 BZOJ,没有题面 洛谷,只是普通版本 题解 原来我们的\(O(n^2)\)做法是设\(f[i][j]\)表示以\(i\)为根的子树中,距离\( ...

  4. 【BZOJ4543】Hotel加强版

    [BZOJ4543]Hotel加强版 题面 bzoj 洛谷 $ps:$在洛谷看题在bzoj交... 题解 我们分析一下这个问题,要怎么样的点才满足三点距离两两相等呢? 1.存在三个点有共同的$LCA$ ...

  5. 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 ...

  6. BZOJ4543 [POI2014]Hotel加强版

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

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

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

  8. 4543: [POI2014]Hotel加强版

    4543: [POI2014]Hotel加强版 链接 分析: f[u][i]表示子树u内,距离u为i的点的个数,g[u][i]表示在子树u内,已经选了两个深度一样的点,还需要在距离u为i的一个点作为第 ...

  9. 蒟蒻的长链剖分学习笔记(例题:HOTEL加强版、重建计划)

    长链剖分学习笔记 说到树的链剖,大多数人都会首先想到重链剖分.的确,目前重链剖分在OI中有更加多样化的应用,但它大多时候是替代不了长链剖分的. 重链剖分是把size最大的儿子当成重儿子,顾名思义长链剖 ...

随机推荐

  1. vs2010(vs2012)好用的扩展插件介绍

    一直以来只使用番茄vs助手(https://www.wholetomato.com/downloads/default.asp)辅助写代码,也都忘了是谁介绍的,不过确实好用. 相比原始的vs,它提供了 ...

  2. python爬虫之requests库

    在python爬虫中,要想获取url的原网页,就要用到众所周知的强大好用的requests库,在2018年python文档年度总结中,requests库使用率排行第一,接下来就开始简单的使用reque ...

  3. linux命令提示符设置

    变成绿色 [root@localhost /usr/local]#vim /root/.bashrc # .bashrc # User specific aliases and functions a ...

  4. python程序设计——面向对象程序设计:方法

    类中定义的方法分为四类:公有方法,私有方法,静态方法,类方法 公有方法.私有方法都属于对象,私有方法的名字以"__"开始 每个对象都有自己的公有方法和私有方法,这两类方法可以访问属 ...

  5. PytorchZerotoAll学习笔记(二)--梯度下降之手动求导

    梯度下降算法:    待优化的损失值为 loss,那么我们希望预测的值能够很接近真实的值 y_pred ≍ y_label      我们的样本有n个,那么损失值可以由一下公式计算得出: 要使得los ...

  6. 算法笔记(c++)-使用递归函数逆序一个栈

    ---恢复内容开始--- 使用递归函数逆序一个栈 题目:使用递归函数,不借助其他数据结构逆序一个栈. 我的思路:使用递归函数保存栈中变量. 递归函数分两个,一个获取并移除栈底元素,另一个负责逆序.其实 ...

  7. 网络安全攻防----html基础

    一.学习html的硬件条件 网页(.Html)是静态的,学习html语言需要选择Chrome浏览器和Sublime3编辑器,选择Chrome浏览器是因为Chrome浏览器兼容性比较好,支持各种各样的插 ...

  8. Qt绘图

    Qt绘图的设置 QPainter::Antialiasing // 反锯齿 QPainter::TextAntialiasing // 文字反锯齿 QPainter::SmoothPixmapTran ...

  9. CS小分队第二阶段冲刺站立会议(5月29日)

    昨日成果:昨天在为主界面设计自主添加应用快捷方式功能,连续遇到困难. 遇到的困难:1.string字符串数组无法在单击事件中使用,提示string无法在eventargs中检索,尝试了各种方式都不行 ...

  10. HDU 5651 xiaoxin juju needs help 逆元

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5651 bc:http://bestcoder.hdu.edu.cn/contests/con ...