传送门

题意:求树上满足三点之间距离两两相等的三元组个数

n≤1e5n\le 1e5n≤1e5

原题数据是n≤5000n\le5000n≤5000

考虑怎么做
f[u][i]f[u][i]f[u][i]表示uuu为根,深度为iii的点的个数
g[u][i]g[u][i]g[u][i]表示uuu为根,满足2点到lcalcalca的距离减去lcalcalca到uuu的距离为iii,即dep[x]+dep[y]−3∗deplca=idep[x]+dep[y]-3*dep_{lca}=idep[x]+dep[y]−3∗deplca​=i的点对个数
换句话说就是还差iii个距离满足能凑成333元组的点对个数


ans+=g[u][i+1]∗f[v][i];ans+=g[u][i+1]*f[v][i];ans+=g[u][i+1]∗f[v][i];
ans+=f[u][i−1]∗g[v][i];ans+=f[u][i-1]*g[v][i];ans+=f[u][i−1]∗g[v][i];
g[u][i+1]+=f[u][i+1]∗f[v][i];g[u][i+1]+=f[u][i+1]*f[v][i];g[u][i+1]+=f[u][i+1]∗f[v][i];
f[u][i+1]+=f[v][i];f[u][i+1]+=f[v][i];f[u][i+1]+=f[v][i];
g[u][i−1]+=g[v][i];g[u][i-1]+=g[v][i];g[u][i−1]+=g[v][i];

这式子很显然吧
发现转移的时候
f[u][i+1]+=f[v][i];f[u][i+1]+=f[v][i];f[u][i+1]+=f[v][i];
g[u][i−1]+=g[v][i];g[u][i-1]+=g[v][i];g[u][i−1]+=g[v][i];
既然只和深度有关,
就可以愉快的长链剖分了

复杂度O(n)O(n)O(n)
据说可以点分O(nlogn)O(nlogn)O(nlogn)
关我p事

#include<bits/stdc++.h>
using namespace std;
const int RLEN=1<22|1;
#define ll long long
inline char gc(){static char ibuf[RLEN],*ob,*ib;(ob==ib)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));return (ib==ob)?EOF:*ib++;
}
inline int read(){char ch=gc();int res=0,f=1;while(!isdigit(ch)){if(ch=='-')f=-f;ch=gc();}while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();return res*f;
}
const int N=1000005;
ll *f[N],*g[N],*id,tmp[N<<2],ans;
int n,adj[N],nxt[N<<1],to[N<<1],dep[N],son[N],cnt;
inline void addedge(int u,int v){nxt[++cnt]=adj[u],adj[u]=cnt,to[cnt]=v;
}
void dfs1(int u,int fa){for(int e=adj[u];e;e=nxt[e]){int v=to[e];if(v==fa)continue;dfs1(v,u);if(dep[v]>dep[son[u]])son[u]=v;}dep[u]=dep[son[u]]+1;
}
void dfs2(int u,int fa){if(son[u]){f[son[u]]=f[u]+1,g[son[u]]=g[u]-1,dfs2(son[u],u);}f[u][0]=1;ans+=g[u][0];for(int e=adj[u];e;e=nxt[e]){int v=to[e];if(v==fa||v==son[u])continue;f[v]=id,id+=dep[v],g[v]=id+dep[v],id+=dep[v]*2;dfs2(v,u);for(int i=dep[v]-1;~i;i--){ans+=g[u][i+1]*f[v][i];if(i)ans+=f[u][i-1]*g[v][i];g[u][i+1]+=f[u][i+1]*f[v][i];f[u][i+1]+=f[v][i];}for(int i=dep[v]-1;i;i--){g[u][i-1]+=g[v][i];}}
}
int main(){n=read();for(int i=1;i<n;i++){int u=read(),v=read();addedge(u,v),addedge(v,u);}dfs1(1,0);id=tmp;f[1]=id,id+=dep[1],g[1]=id+dep[1],id+=dep[1]*2;dfs2(1,0);cout<<ans;
}

转载于:https://www.cnblogs.com/stargazer-cyk/p/11145583.html

【BZOJ4543】【POI2014】Hotel加强版(长链剖分)相关推荐

  1. 【BZOJ】4543: [POI2014]Hotel加强版-长链剖分DP

    传送门:bzoj4543 题解 三点两两距离相等的情况如下图: 设 f [ i ] [ j ] f[i][j] f[i][j]表示 i i i子树中与 i i i距离为 j j j(相对深度为 j j ...

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

  3. bzoj4543. [POI2014]Hotel加强版

    bzoj4543. [POI2014]Hotel加强版 题面描述 Solution 先看n≤5e3n \leq 5e3n≤5e3怎么做. 考虑树形dpdpdp. 设f[i][j]f[i][j]f[i] ...

  4. BZOJ4543/BZOJ3522 [POI2014]Hotel加强版(长链剖分)

    题目好神仙--这个叫长链剖分的玩意儿更神仙-- 考虑dp,设\(f[i][j]\)表示以\(i\)为根的子树中到\(i\)的距离为\(j\)的点的个数,\(g[i][j]\)表示\(i\)的子树中有\ ...

  5. 【BZOJ4543】Hotel加强版【神仙树形dp】【长链剖分】

    题意:给一棵 nnn 个点的树,求两两距离相等的三元组个数. n≤105n\leq 10^5n≤105 显然相当于是找一个点到这三个点距离相等.子树内和子树外到当前点的距离为某个值的点的个数可以长链剖 ...

  6. P3565 [POI2014]HOT-Hotels(树形dp+长链剖分)

    P3565 [POI2014]HOT-Hotels 参考题解 题目大意: 给定一棵树,在树上选 3 个点,要求两两距离相等,求方案数. 三个点树上两两距离为d存在下面两种情况 某个点三个子树(保证该点 ...

  7. P5904-[POI2014]HOT-Hotels加强版【长链剖分,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P5904 题目大意 nnn个点的一棵树,求有多少个点对(i,j,k)(i,j,k)(i,j,k)使得这三个点距离相等 ...

  8. 树链剖分之长链剖分 详解 题目整理

    树链剖分 题目中出现的树链剖分一般分为两种,重链剖分和长链剖分 重链剖分:选择子树最大的儿子, 将其归入当前点所在 的同一条重链 长链剖分:选择向下能达到的深 度最深的儿子,将其归 入当前点所在的同一 ...

  9. Bzoj4016/洛谷P2993 [FJOI2014] 最短路径树问题(最短路径问题+长链剖分/点分治)

    题面 Bzoj 洛谷 题解 首先把最短路径树建出来(用\(Dijkstra\),没试过\(SPFA\)\(\leftarrow\)它死了),然后问题就变成了一个关于深度的问题,可以用长链剖分做,所以我 ...

最新文章

  1. Creating Apps With Material Design —— Defining Custom Animations
  2. hdu 3374 String Problem (字符串最小最大表示 + KMP求循环节)
  3. 表达式封装和模型驱动封装的区别
  4. Java学习(三)面向对象异常
  5. Scrapy运行中常见网络相关错误
  6. java手动提交事务_Mybatis是如何将事务和连接池高效的结合的
  7. C++内存管理——指针数组
  8. List集合的去重问题
  9. kubernetes 客户端client-go 使用及常用api
  10. 海康威视错误代码0xf_海康威视嵌入式软件工程师笔试题分享(含解答)
  11. 【leetcode】1018. 可被 5 整除的二进制前缀
  12. MacBook电池健康程度的检查
  13. 有趣的问题:C的表达式x == x,何时为假?!
  14. Atitit 知识图谱解决方案:提供完整知识体系架构的搜索与知识结果overview
  15. 现版本IE11调试工具
  16. 切换不了摄像头 高拍仪_高拍仪常见问题解答
  17. python模拟登陆微博_超详细的Python实现微博模拟登陆,小白都能懂
  18. simpleCaptcha语音验证码实现及其扩展
  19. 全球及中国HSK刀柄行业投资态势及前景建议研究报告2022版
  20. 国际商务谈判A卷+答案

热门文章

  1. PWN-PRACTICE-CTFSHOW-1
  2. mysql 索引 lt =_MySQL索引相关
  3. 【2019牛客暑期多校训练营(第三场)- F】Planting Trees(单调队列,尺取)
  4. 【HDU - 5881】Tea(思维,找规律)
  5. 【HDU - 5914 】Triangle (打表 或 set维护)
  6. 3.Programming in TensorFlow and Keras
  7. Linux中wait接口用于延时,linux2.6驱动编写参考
  8. mysql innodb 全表锁,Mysql InnoDB行锁及表锁分享
  9. java see 方法_Java 反射常用方法
  10. Linux 性能检查命令总结