SP15438 UCV2013J - Valences
题面
给定一个包含 \(N\) 个节点的完全二叉树的 BFS 序,求这棵树的所有叶子节点上的数之和。
思路
首先,叶子结点在BFS序上有什么性质呢,就是一个包含 \(N\) 个节点的完全二叉树,那么叶子结点位于 \([n \div 2+1,n]\)。
下面给出简单的证明:
首先,完全二叉树是一个除底层外都是满的二叉树,而满二叉树是一个特例。
为了简单,就先考虑满二叉树吧!
令层数为 \(l\),那么底层就有 \(2^{l-1}\) 个节点,而非底层有 \(\sum\limits_{i=1}^{l-1}2^{i-1} = 2^{l-1}\) 个节点,也就是说,非底层=底层。
是不是很简单!
对于一般的完全二叉树,你会惊奇的发现,也是这样的!
代码
为了防止MLE(好像也没有这么毒瘤),可以不开数组,直接判断是否是叶子结点就好了。
单组时间复杂度 \(O(n)\)
代码如下:
#include <bits/stdc++.h>
using namespace std;
int n;
void solve(){
int ans=0;
for(int i=1,tmp;i<=n;i++){
cin>>tmp;
if(i>(n/2)){
ans+=tmp;
}
}
cout<<ans<<'\n';
}
int main(){
while(1){
cin>>n;
if(n==0)break;
solve();
}
return 0;
}