前置:完全二叉树性质
对于第 $i$ 层,保证存在 $2^{i-1}$ 个结点的满二叉树。
题目思路:
对于每一层的和,我们可以用 $h$ 数组进行存储:
$h_1$ = $\sum\limits^{2^{1}-1}_{i=2^{1-1}}(a_i)$
$h_2$ = $\sum\limits^{2^{2}-1}_{i=2^{2-1}}(a_i)$
$h_3$ = $\sum\limits^{2^{3}-1}_{i=2^{3-1}}(a_i)$
$h_4$ = $\sum\limits^{2^{4}-1}_{i=2^{4-1}}(a_i)$
…
是不是发现突然很简单?对于每个 $h_i$,我们可以求 $\sum\limits^{2^{i}-1}_{j=2^{i-1}}(a_j)$ 就行啦!
code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 0x7ffffff;
int n;
int a[1 << 17], h[17];//2^17 > 10^5
signed main() {
scanf ("%lld", &n);
for (int i = 1; i <= n; i ++)
scanf ("%lld", a + i);
//读入 ai,因为 n 的大小是 10^5, 所以用 scanf 这类较快的读入方式。
int i = 1, j = 0;
while (i <= n) {
++ j;
while (i < pow (2, j)) {//从 2^(j-1) 循环到 2^j-1
h[j] += a[i ++];
}
}
int maxx = -INF, res = 0;//找最大
for (i = 1; i <= j; i ++)
if (h[i] > maxx)
maxx = h[i],
res = i;
printf ("%lld\n", res);
return 0;
}
死活12过10求指点