Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
28464 | gaochunzhen | 【BJ】T1 | C++ | 运行超时 | 73 | 2000 MS | 109624 KB | 1667 | 2024-04-14 17:44:09 |
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 9, C = 20; int n, a[N]; struct ST { int st[N][25]; void init() { for (int i = 0; i <= n + 1; i++) st[i][0] = a[i]; for (int j = 1; (1 << j) <= n + 2; j++) { for (int i = 0; i + (1 << j) - 1 <= n + 1; i++) { st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]); } } } int qry(int l, int r) { int i = __lg(r - l + 1); return max(st[l][i], st[r - (1 << i) + 1][i]); } } st; double ans, pw[N]; int main() { scanf("%d", &n); pw[0] = 1; for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); pw[i] = 0.5 * pw[i - 1]; } a[0] = a[n + 1] = 1e9, st.init(); for (int i = 1; i <= n; i++) { int l = i, r = i, c = 1; double s1 = 0, s2 = 0; while (r >= 0 && c <= C) { for (int j = 20; j >= 0; j--) { if (r < (1 << j)) continue; if (st.st[r - (1 << j) + 1][j] <= a[i]) r -= (1 << j); } if (a[r] <= a[i]) r--; s1 += (l - r) * pw[c++]; l = r--; } l = i, r = i + 1, c = 1; while (r <= n + 1 && c <= C) { for (int j = 20; j >= 0; j--) { if (r + (1 << j) - 1 > n) continue; if (st.st[r][j] < a[i]) r += (1 << j); } if (a[r] < a[i]) r++; s2 += (r - l) * pw[c++]; l = r++; } ans += 2.0 * a[i] * s1 * s2; } printf("%.10f\n", ans / n / n); return 0; }