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=n−i。
如果 r ≥ d r\\ge d r≥d 显然情况1答案为: 2 D 2^D 2D。
否则为0。
情况2:显然要分别从结点的左子树和右子树各选择一个结点。
假设左边选择的点 u u u距离点 l c a lca lca为 k k k,则右边距离为: D − k D-k D−k。
对应的贡献为: 2 k − 1 × 2 D − k − 1 = 2 D − 2 2^{k-1}\\times 2^{D-k-1}=2^{D-2} 2k−1×2D−k−1=2D−2
要满足 m a x ( k , D − k ) ≤ r , k ∈ ( 0 , D ) max(k,D-k)\\le r, k\\in (0,D) max(k,D−k)≤r,k∈(0,D)
则 k k k的右端点取值范围: L = m i n ( r , D − 1 ) L=min(r,D-1) L=min(r,D−1)
左端点取值范围: D − L D-L D−L。
要满足 L ≤ R L\\le R L≤R才有贡献。
然后每次计算贡献时都要乘上该层结点的个数: 2 i − 1 2^{i-1} 2i−1
时间复杂度: 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
poj-1657 Distance on Chessboard
codechef Prime Distance On Tree(树分治+FFT)