E - Distance on Large Perfect Binary Tree(数学&LCA)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了E - Distance on Large Perfect Binary Tree(数学&LCA)相关的知识,希望对你有一定的参考价值。

E - Distance on Large Perfect Binary Tree(数学&LCA)

记结点 u u u到根的距离为 u u u的深度。

记录 d i s ( u , v ) = D dis(u,v)=D dis(u,v)=D L C A ( u , v ) LCA(u,v) LCA(u,v)的深度为 i i i的答案为: f ( i ) f(i) f(i)

情况1:当 i = d e p ( u )   o r   i = d e p ( v ) i=dep(u)\\ or\\ i=dep(v) i=dep(u) or i=dep(v) 时,答案为 2 D   o r   0 2^D\\ or \\ 0 2D or 0

枚举层 i i i

当前层 i i i与叶子的距离为: r = n − i r=n-i r=ni

如果 r ≥ d r\\ge d rd 显然情况1答案为: 2 D 2^D 2D

否则为0。

情况2:显然要分别从结点的左子树和右子树各选择一个结点。

假设左边选择的点 u u u距离点 l c a lca lca k k k,则右边距离为: D − k D-k Dk

对应的贡献为: 2 k − 1 × 2 D − k − 1 = 2 D − 2 2^{k-1}\\times 2^{D-k-1}=2^{D-2} 2k1×2Dk1=2D2

要满足 m a x ( k , D − k ) ≤ r , k ∈ ( 0 , D ) max(k,D-k)\\le r, k\\in (0,D) max(k,Dk)r,k(0,D)

k k k的右端点取值范围: L = m i n ( r , D − 1 ) L=min(r,D-1) L=min(r,D1)

左端点取值范围: D − L D-L DL

要满足 L ≤ R L\\le R LR才有贡献。

然后每次计算贡献时都要乘上该层结点的个数: 2 i − 1 2^{i-1} 2i1

时间复杂度: O ( m a x ( n , d ) ) O(max(n,d)) O(max(n,d))

// Problem: E - Distance on Large Perfect Binary Tree
// Contest: AtCoder - AtCoder Beginner Contest 220
// URL: https://atcoder.jp/contests/abc220/tasks/abc220_e
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// Date: 2021-09-26 22:37:27
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=2e6+5,M=2e4+5,inf=0x3f3f3f3f,mod=998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr) 
void Print(int *a,int n){
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 
}
int n,d;
ll a[N],ans;
int main(){
	scanf("%d%d",&n,&d);a[0]=1;
	int mx=max(n,d);
	rep(i,1,mx) a[i]=(a[i-1]<<1)%mod;
	rep(i,1,n){
		int r=n-i;//rest down dis
		if(r>=d) ans=(ans+a[i-1]*a[d]%mod)%mod;
		int R=min(r,d-1);
		int L=d-R;
		if(L>R) continue;
		ans=(ans+(R-L+1)*a[i-1]%mod*a[d-2]%mod)%mod;
	}
	ans=(ans<<1)%mod;
	printf("%lld\\n",ans);
	return 0;
}

以上是关于E - Distance on Large Perfect Binary Tree(数学&LCA)的主要内容,如果未能解决你的问题,请参考以下文章

论文阅读|深读 GraphSAGE:Inductive Representation Learning on Large Graphs

R合并具有相同列的两个数据框而不替换值[重复]

poj-1657 Distance on Chessboard

codechef Prime Distance On Tree(树分治+FFT)

Mysql select on indexed column slowdown on large tables

bzoj4449 [Neerc2015]Distance on Triangulation