bzoj 4543 HOTEL 加强版
题目大意:
求树上取三个点这三个点两两距离相等的方案数
思路:
远古时候的$n^2$做法是换根 但那样无法继续优化了
学习了一波长链剖分
考虑如何在一棵树上进行dp
设$f[i][j]$表示以$i$为根的子树内与$i$的距离为$j$的点数量
$g[i][j]$表示以$i$为根的子树内满足与lca距离为$d$且lca与$i$的距离为$d-j$的点对数(lca在子树内)
对于每个子树 对答案的贡献为$g[x][0]$与对每一个新进来的子树$\sum _{i=0} ^{mxd[v]} f[x][i-1]*g[v][i]+g[x][i+1]*f[v][i]$
更新$f,g$的时候除了正常的继承的子树 $g[x][i+1]+=f[x][i+1]*f[v][i]$
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define ll long long
#define inf 2139062143
#define MAXN 100100
#define MOD 998244353
#define rep(i,s,t) for(register int i=(s),i##__end=(t);i<=i##__end;++i)
#define dwn(i,s,t) for(register int i=(s),i##__end=(t);i>=i##__end;--i)
#define ren for(register int i=fst[x];i;i=nxt[i])
#define pb(i,x) vec[i].push_back(x)
#define pls(a,b) (a+b)%MOD
#define mns(a,b) (a-b+MOD)%MOD
#define mul(a,b) (1LL*(a)*(b))%MOD
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,*f[MAXN],*g[MAXN],tmp[MAXN<<],*id=tmp,ans;
int fst[MAXN],nxt[MAXN<<],to[MAXN<<],cnt,mxd[MAXN],son[MAXN];
void add(int u,int v) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v;}
void dfs(int x,int pa)
{
ren if(to[i]^pa) {dfs(to[i],x);if(mxd[to[i]]>mxd[son[x]]) son[x]=to[i];}
mxd[x]=mxd[son[x]]+;
}
void New(int x) {f[x]=id,id+=mxd[x]<<,g[x]=id,id+=mxd[x]<<;}
void dp(int x,int pa)
{
if(son[x]) {f[son[x]]=f[x]+,g[son[x]]=g[x]-;dp(son[x],x);}
f[x][]=,ans+=g[x][];
ren if(to[i]^pa&&to[i]^son[x])
{
New(to[i]);dp(to[i],x);
rep(j,,mxd[to[i]])
{
ans+=g[x][j+]*f[to[i]][j];
if(j) ans+=f[x][j-]*g[to[i]][j];
}
rep(j,,mxd[to[i]])
{
g[x][j+]+=f[x][j+]*f[to[i]][j],f[x][j+]+=f[to[i]][j];
if(j) g[x][j-]+=g[to[i]][j];
}
}
}
int main()
{
n=read();int a,b;rep(i,,n) a=read(),b=read(),add(a,b),add(b,a);
dfs(,);New();dp(,);printf("%d\n",ans);
}
bzoj 4543 HOTEL 加强版的更多相关文章
- 4543: [POI2014]Hotel加强版
4543: [POI2014]Hotel加强版 链接 分析: f[u][i]表示子树u内,距离u为i的点的个数,g[u][i]表示在子树u内,已经选了两个深度一样的点,还需要在距离u为i的一个点作为第 ...
- 【BZOJ4543】Hotel加强版(长链剖分)
[BZOJ4543]Hotel加强版(长链剖分) 题面 BZOJ,没有题面 洛谷,只是普通版本 题解 原来我们的\(O(n^2)\)做法是设\(f[i][j]\)表示以\(i\)为根的子树中,距离\( ...
- 【BZOJ4543】Hotel加强版
[BZOJ4543]Hotel加强版 题面 bzoj 洛谷 $ps:$在洛谷看题在bzoj交... 题解 我们分析一下这个问题,要怎么样的点才满足三点距离两两相等呢? 1.存在三个点有共同的$LCA$ ...
- 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加强版
题意 有一个树形结构,每条边的长度相同,任意两个节点可以相互到达.选3个点.两两距离相等.有多少种方案? 数据范围:n<=100000 分析 参照小蒟蒻yyb的博客. 我们先考虑一个\(O(n^ ...
- 【BZOJ4543】[POI2014]Hotel加强版 长链剖分+DP
[BZOJ4543][POI2014]Hotel加强版 Description 同OJ3522数据范围:n<=100000 Sample Input 7 1 2 5 7 2 5 2 3 5 6 ...
- 【刷题】BZOJ 4543 [POI2014]Hotel加强版
Description 同OJ3522 数据范围:n<=100000 Solution dp的设计见[刷题]BZOJ 3522 [Poi2014]Hotel 然后发现dp的第二维与深度有关,于是 ...
- BZOJ.4543.[POI2014]Hotel加强版(长链剖分 树形DP)
题目链接 弱化版:https://www.cnblogs.com/SovietPower/p/8663817.html. 令\(f[x][i]\)表示\(x\)的子树中深度为\(i\)的点的个数,\( ...
- bzoj 4543: [POI2014]Hotel加强版
Description 给出一棵树求三元组 \((x,y,z)\,,x<y<z\) 满足三个点两两之间距离相等,求三元组的数量 Solution 考虑暴力 \(DP\) 设 \(f[i][ ...
随机推荐
- [Docker]容器镜像
1.rootfs的基础知识 Mount namespaces 隔离的是文件系统挂接点,它使每个容器能看到不同的文件系统层次结构,即每当创建一个新容器时,希望容器进程看到的文件系统时一个独立的隔离环境 ...
- 什么是Service Mesh?
转至大佬宋净明的博客:https://jimmysong.io/posts/what-is-a-service-mesh/ Service mesh 又译作 “服务网格”,作为服务间通信的基础设施层. ...
- UITableView点击背景
系统自定义的点击背景有时间觉得效果不好想换个 - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelect ...
- 【python可视化系列】python数据可视化利器--pyecharts
学可视化就跟学弹吉他一样,刚开始你会觉得自己弹出来的是噪音,也就有了在使用python可视化的时候,总说,我擦,为啥别人画的图那么溜: [python可视化系列]python数据可视化利器--pyec ...
- HDU1423 最长公共上升子序列LCIS
Problem Description This is a problem from ZOJ 2432.To make it easyer,you just need output the lengt ...
- HDU 6390
GuGuFishtion Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- [bzoj4199][Noi2015]品酒大会_后缀自动机_后缀树_树形dp
品酒大会 bzoj-4199 Noi-2015 题目大意:给定一个字符串,如果其两个子串的前$r$个字符相等,那么称这两个子串的开头两个位置$r$相似.如果两个位置勾兑在一起那么美味度为两个位置的乘积 ...
- Triangle(dp)
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...
- 2017icpc乌鲁木齐网络赛Colored Graph (构造)
题目 https://nanti.jisuanke.com/t/16958 题意 给定一个n(n<=500)个点的无向图,给每条边黑白染色,输出同色三角形最少的个数和对应的方案 分析 首先考虑给 ...
- Java添加、提取、替换和删除PDF图片
(一)简介 这篇文章将介绍在Java中添加.提取.删除和替换PDF文档中的图片. 工具使用: Free Spire.PDF for JAVA 2.4.4(免费版) Intellij IDEA Jar包 ...