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;
}

posted @ 2022-04-19 13:10  蒟蒻xiezheyuan  阅读(33)  评论(0编辑  收藏  举报