Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
28473 | gaochunzhen | 【BJ】T1 | C++ | 运行超时 | 96 | 3016 MS | 23688 KB | 1191 | 2024-04-14 19:11:45 |
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 9, C = 50; int n, a[N], nxt[N], lst[N], p[N]; void del(int u) { nxt[lst[u]] = nxt[u], lst[nxt[u]] = lst[u]; } double ans, pw[N]; int main() { scanf("%d", &n); pw[0] = 1, pw[1] = 0.5; for (int i = 2; i <= n + 1; i++) { scanf("%d", &a[i]); pw[i] = 0.5 * pw[i - 1], p[i] = i; nxt[i] = i + 1, lst[i] = i - 1; } a[1] = a[n + 2] = 1e9, lst[1] = nxt[n + 2] = 0; sort(p + 2, p + n + 2, [&](int x, int y) {return a[x] < a[y];}); for (int id = 2; id <= n + 1; id++) { int i = p[id], lt = i; double s1 = 0, s2 = 0; for (int j = i, c = 1; j && c <= C; j = lst[j]) { if (a[j] < a[i]) {del(j); continue;} else if (a[j] > a[i]) { s1 += (lt - j) * pw[c++], lt = j; } } lt = i; for (int j = nxt[i], c = 1; j && c <= C; j = nxt[j]) { if (a[j] < a[i]) {del(j); continue;} s2 += (j - lt) * pw[c++], lt = j; } ans += 2.0 * a[i] * s1 * s2; } printf("%.15f\n", ans / n / n); return 0; }