#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#ifdef ONLINE_JUDGE
#define debug(...) 0
#else
#define debug(...) fprintf(stderr, __VA_ARGS__), fflush(stderr)
#endif
const int N = 5e5 + 5;
int n;
int a[N];
int L[N], R[N];
ll f[N];
void add(int l, int r, ll v) {if (l <= r) f[l] += v, f[r + 1] -= v;}
void add(int i, ll v) {add(i, i, v);}
int st[N][20];
int query(int l, int r) {int k = __lg(r - l + 1); return min(st[l][k], st[r - (1 << k) + 1][k]);}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int tt;
cin >> tt;
while (tt--) {
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i], st[i][0] = a[i];
for (int j = 1; (1 << j) <= n; j++)
for (int i = 1; i + (1 << j) - 1 <= n; i++)
st[i][j] = min(st[i][j - 1], st[i + (1 << j - 1)][j - 1]);
stack<int> stk;
stk.push(0);
a[0] = 0;
for (int i = 1; i <= n; i++) {
while (!stk.empty() && a[stk.top()] >= a[i]) stk.pop();
L[i] = stk.top();
stk.push(i);
}
while (!stk.empty()) stk.pop();
stk.push(n + 1);
a[n + 1] = 0;
for (int i = n; i; i--) {
while (!stk.empty() && a[stk.top()] >= a[i]) stk.pop();
R[i] = stk.top();
stk.push(i);
}
for (int i = 0; i <= n; i++) f[i] = 0;
for (int i = 1; i <= n; i++) {
add(1, L[i] - 1, 1ll * a[i] * (i - L[i]) * (R[i] - i));
add(R[i] + 1, n, 1ll * a[i] * (i - L[i]) * (R[i] - i));
add(L[i] + 1, i - 1, 1ll * a[i] * (i - 1 - L[i]) * (R[i] - i));
add(i + 1, R[i] - 1, 1ll * a[i] * (i - L[i]) * (R[i] - 1 - i));
int l = 1, r = L[i] - 1, res = 0;
while (l <= r) {
int mid = l + r >> 1;
if (query(mid, L[i] - 1) < a[i]) res = mid, l = mid + 1;
else r = mid - 1;
}
add(L[i], 1ll * a[i] * (i - 1 - res) * (R[i] - i));
l = R[i] + 1, r = n, res = n + 1;
while (l <= r) {
int mid = l + r >> 1;
if (query(R[i] + 1, mid) < a[i]) res = mid, r = mid - 1;
else l = mid + 1;
}
add(R[i], 1ll * a[i] * (i - L[i]) * (res - 1 - i));
}
for (int i = 1; i <= n; i++) {
f[i] += f[i - 1];
cout << f[i] << " \n"[i == n];
}
}
return 0;
}
Codeforces Round 958 (Div. 2)1988E(分类讨论
最新推荐文章于 2024-08-08 15:12:59 发布