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. 《More Effective C++》读书笔记(零)Basic 基础条款

    这是篇读书笔记,只记录自己的理解和总结,一般情况不对其举例子具体说明,因为那正是书本身做的事情,我的笔记作为梳理和复习之用,划重点.我推荐学C++的人都好好读一遍Effective C++ 系列,真是 ...

  2. gopherjs

    An example implementation of a GopherJS client and a Go server using the Improbable gRPC-Web impleme ...

  3. 记录一次爬虫报错:Message: Failed to decode response from marionette

    由于标题中的错误引发: Message: Tried to run command without establishing a connection 解释: 先说一下我的爬虫架构,用的是firefo ...

  4. Amazon Seller Central is Temporarily Unavailable

    Seller Central is Temporarily Unavailable We apologize for the inconvenience. Our technical staff is ...

  5. “Hello World!”团队第七次Scrum立会

    "Hello world!"团队召开第七次Scrum立会.博客内容: 1.会议时间 2.会议成员 3.会议地点 4.会议内容 5.Todo list 6.会议照片 7.燃尽图 一. ...

  6. Bate版本控制报告

    报告beta阶段2周中,项目的版本控制情况,不包括未在coding.net的部分. 包括不限于:check in (不是push)次数; 总词数为29次 check in log(时间.人员.mess ...

  7. Java的继承,final关键字,super关键字

    1.继承的初始化顺序: 父类—>父类的初始化对象中的属性—>父类的构造方法—>子类—>子类的初始化对象中的属性—>子类的构造方法 若有构造方法:则先执行属性,再执行构造方 ...

  8. HDU 5172 GTY's gay friends 线段树+前缀和+全排列

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5172 bc(中文):http://bestcoder.hdu.edu.cn/contest ...

  9. 周总结<1>

    由于都不清楚周总结的格式,所以就没有写了.不过,上次听了老师的课,觉得应该要好好写写了,至少今后可以明白自己有做过什么事情,至少不会觉得自己在各个方面没有收获.不过,可能没有按照格式来写.希望老师体谅 ...

  10. web登录密码加密

    文章:如何实现登录页面密码加密 文章:用RSA加密实现Web登录密码加密传输 文章:web登录用户名密码加密 知乎文章:Web前端密码加密是否有意义? 文章:记录一次黑客模拟攻击 成功拿到淘宝账号和密 ...