1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
void solve() {
int n;
cin >> n;
vi a(n);
rep(i, 0, n - 1) cin >> a[i];
ll ans = 1LL * n * (n + 1) / 2;
ll tem = 0;
vi l(n, -1);
stack<int> s;
rep(i, 0, n - 1) {
while (!s.empty() && a[s.top()] >= a[i]) s.pop();
if (!s.empty()) l[i] = s.top();
s.push(i);
}
int las = 0;
vi l2(n, 0);
rep(i, 1, n - 1) {
if (a[i] > a[i - 1] + 1) {
las = i;
}
l2[i] = las;
}
rep(i, 1, n - 1) {
int tem = (l2[i] > l[i]) ? i : (i - l[i] - 1);
ans += 1LL * tem * (n - i);
}
cout << ans << endl;
return;
}
|