输入样例:
7
1 6 5 4 3 2 1
输出样例:
7
1 6 5 4 3 2 1
思路
利用前缀和,枚举比较不同区间内的前缀和。
注意:n不能保证为满二叉树的节点数,所以最后确定区间右边界需要特殊讨论
代码
#include<bits/stdc++.h>
#include<algorithm>
#define ll long long
#define pii pair<int,int >
#define inf 1e9
using namespace std;
const int N = 1e5+10;
int n, d, k;
int a[N];
ll sum[N];
void solve(){
cin>>n;
for(int i = 1;i <= n;i++)cin>>a[i], sum[i]=sum[i-1]+a[i];
int pos = 1, ans = 0;
ll ma = 0;
int l = 0, r = pow(2,pos-1);
for(;l!=n;){
// cout<<l<<" "<<r<<"\n";
if(ma < sum[r]-sum[l])ma = sum[r]-sum[l],ans = pos;
// cout<<sum[r]-sum[l]<<"_\n";
pos++;l = r, r = (r+pow(2,pos-1))>n?n:(r+pow(2,pos-1));
}
cout<<ans<<"\n";
}
int main(){
solve();
return 0;
}