个人题解链接,历届试题,正在更新中~
输入
第一行包含一个整数 N。 第二行包含N个整数
A
1
,
A
2
,
⋅
⋅
⋅
A
N
A_1,A_2,··· A_N
A1,A2,⋅⋅⋅AN。
输出
输出一个整数代表答案。
样例输入
7
1 6 5 4 3 2 1
样例输出
2
数据范围
对于所有评测用例,1 ≤ N≤ 100000,−100000 ≤ Ai≤ 100000。
做法:
第i层的第一个节点编号是
2
i
2^i
2i(1号节点算第0层),最后一个节点是
2
i
+
1
−
1
2^{i+1}-1
2i+1−1,所以做一次前缀和,然后再判断即可
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const double Pi = acos(-1);
namespace {
template <typename T> inline void read(T &x) {
x = 0; T f = 1;char s = getchar();
for(; !isdigit(s); s = getchar()) if(s == '-') f = -1;
for(; isdigit(s); s = getchar()) x = (x << 3) + (x << 1) + (s ^ 48);
x *= f;
}
}
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define _for(n,m,i) for (register int i = (n); i < (m); ++i)
#define _rep(n,m,i) for (register int i = (n); i <= (m); ++i)
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define lowbit(x) x & (-x)
#define pii pair<int,int>
#define fi first
#define se second
const int N = 1e6+5;
int a[N];
int main() {
int n; read(n);
_rep(1, n, i) read(a[i]), a[i] += a[i-1];
int Max = 0, ans = 0;
int l = 1, r = 1, c = 1;
while(l <= n) {
if(Max < a[r] - a[l-1]) {
Max = a[r] - a[l-1];
ans = c;
}
c++;
l = r+1;
r = (1<<c)-1;
if(r > n) r = n;
}
cout << ans << endl;
}