#include <bits/stdc++.h>
using namespace std;
const int FIXNEG = 2e5 + 5, N = FIXNEG * 2;
struct SegTree{
pair<int, long long> tree[N * 4];
int ladd[N * 4];
bool lset[N * 4];
pair<int, long long> merge(pair<int, long long> a, pair<int, long long> b, long long cnt){
cnt = max(cnt, 0ll);
pair<int, long long> c;
c.first = a.first + b.first;
c.second = a.second + cnt * a.first + b.second;
return c;
}
void push(int v, int l, int r){
if(lset[v]){
tree[v] = {0, 0};
if(v * 2 < N * 4){
lset[v * 2] = lset[v * 2 + 1] = true;
ladd[v * 2] = ladd[v * 2 + 1] = 0;
}
lset[v] = 0;
}
if(ladd[v]){
tree[v].first += ladd[v] * (r - l + 1);
tree[v].second += ladd[v] * (((r - l + 1ll) * (r - l + 2ll)) / 2);
if(v * 2 < N * 4){
ladd[v * 2] += ladd[v], ladd[v * 2 + 1] += ladd[v];
}
ladd[v] = 0;
}
}
void reset(){
lset[1] = true, ladd[1] = 0;
}
pair<int, long long> query(int l, int r, int v = 1, int tl = 0, int tr = N - 1){
if(l > r) return {0, 0};
else{
push(v, tl, tr);
if(l == tl && r == tr) return tree[v];
else{
int tm = tl + (tr - tl) / 2;
return merge(query(l, min(tm, r), v * 2, tl, tm), query(max(tm + 1, l), r, v * 2 + 1, tm + 1, tr), r - max(tm + 1, l) + 1);
}
}
}
void rangeadd(int l, int r, int v = 1, int tl = 0, int tr = N - 1){
if(l > r) return;
else{
push(v, tl, tr);
if(l == tl && r == tr) ladd[v] += 1, push(v, tl, tr);
else{
int tm = tl + (tr - tl) / 2;
rangeadd(l, min(tm, r), v * 2, tl, tm);
rangeadd(max(tm + 1, l), r, v * 2 + 1, tm + 1, tr);
push(v * 2, tl, tm), push(v * 2 + 1, tm + 1, tr);
tree[v] = merge(tree[v * 2], tree[v * 2 + 1], tr - (tm + 1) + 1);
}
}
}
};
SegTree sgt;
int n, arr[N], prvindx, prvans;
long long ans;
map<int, vector<int>> mp;
vector<int> v;
int main(){
ios_base::sync_with_stdio(false);cin.tie(NULL);
cin >> n;
for(int i = 1; i <= n; i++){
cin >> arr[i];
mp[arr[i]].push_back(i);
}
for(auto p : mp){
v = p.second;
prvindx = 0, prvans = 0 + FIXNEG;
sgt.reset();
sgt.rangeadd(0 + FIXNEG, 0 + FIXNEG);
for(auto indx : v){
ans += sgt.query(prvans - (indx - prvindx - 1) - 1, prvans - 2).second + sgt.query(0, prvans - (indx - prvindx - 1) - 2).first * (long long)(indx - prvindx - 1);
sgt.rangeadd(prvans - (indx - prvindx - 1), prvans - 1);
prvans = prvans - (indx - prvindx - 1) + 1;
ans += sgt.query(0, prvans - 1).first;
sgt.rangeadd(prvans, prvans);
prvindx = indx;
}
prvans = prvans - (n - prvindx);
ans += sgt.query(prvans - 1, prvans - 1 + (n - prvindx) - 1).second + sgt.query(0, prvans - 2).first * (long long)(n - prvindx);
}
cout << ans;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
25376 KB |
Output is correct |
2 |
Correct |
13 ms |
25376 KB |
Output is correct |
3 |
Correct |
12 ms |
25452 KB |
Output is correct |
4 |
Correct |
12 ms |
25408 KB |
Output is correct |
5 |
Correct |
13 ms |
25436 KB |
Output is correct |
6 |
Correct |
13 ms |
25504 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
25376 KB |
Output is correct |
2 |
Correct |
13 ms |
25376 KB |
Output is correct |
3 |
Correct |
12 ms |
25452 KB |
Output is correct |
4 |
Correct |
12 ms |
25408 KB |
Output is correct |
5 |
Correct |
13 ms |
25436 KB |
Output is correct |
6 |
Correct |
13 ms |
25504 KB |
Output is correct |
7 |
Correct |
14 ms |
25520 KB |
Output is correct |
8 |
Correct |
11 ms |
25456 KB |
Output is correct |
9 |
Correct |
13 ms |
25524 KB |
Output is correct |
10 |
Correct |
15 ms |
25556 KB |
Output is correct |
11 |
Correct |
13 ms |
25520 KB |
Output is correct |
12 |
Correct |
14 ms |
25556 KB |
Output is correct |
13 |
Correct |
13 ms |
25500 KB |
Output is correct |
14 |
Correct |
15 ms |
25544 KB |
Output is correct |
15 |
Correct |
14 ms |
25568 KB |
Output is correct |
16 |
Correct |
14 ms |
25528 KB |
Output is correct |
17 |
Correct |
13 ms |
25528 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
114 ms |
27564 KB |
Output is correct |
2 |
Correct |
143 ms |
28172 KB |
Output is correct |
3 |
Correct |
94 ms |
26984 KB |
Output is correct |
4 |
Correct |
150 ms |
28136 KB |
Output is correct |
5 |
Correct |
158 ms |
28624 KB |
Output is correct |
6 |
Correct |
162 ms |
28436 KB |
Output is correct |
7 |
Correct |
168 ms |
28568 KB |
Output is correct |
8 |
Correct |
157 ms |
28552 KB |
Output is correct |
9 |
Correct |
169 ms |
28452 KB |
Output is correct |
10 |
Correct |
207 ms |
28352 KB |
Output is correct |
11 |
Correct |
120 ms |
31712 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
25376 KB |
Output is correct |
2 |
Correct |
13 ms |
25376 KB |
Output is correct |
3 |
Correct |
12 ms |
25452 KB |
Output is correct |
4 |
Correct |
12 ms |
25408 KB |
Output is correct |
5 |
Correct |
13 ms |
25436 KB |
Output is correct |
6 |
Correct |
13 ms |
25504 KB |
Output is correct |
7 |
Correct |
14 ms |
25520 KB |
Output is correct |
8 |
Correct |
11 ms |
25456 KB |
Output is correct |
9 |
Correct |
13 ms |
25524 KB |
Output is correct |
10 |
Correct |
15 ms |
25556 KB |
Output is correct |
11 |
Correct |
13 ms |
25520 KB |
Output is correct |
12 |
Correct |
14 ms |
25556 KB |
Output is correct |
13 |
Correct |
13 ms |
25500 KB |
Output is correct |
14 |
Correct |
15 ms |
25544 KB |
Output is correct |
15 |
Correct |
14 ms |
25568 KB |
Output is correct |
16 |
Correct |
14 ms |
25528 KB |
Output is correct |
17 |
Correct |
13 ms |
25528 KB |
Output is correct |
18 |
Correct |
114 ms |
27564 KB |
Output is correct |
19 |
Correct |
143 ms |
28172 KB |
Output is correct |
20 |
Correct |
94 ms |
26984 KB |
Output is correct |
21 |
Correct |
150 ms |
28136 KB |
Output is correct |
22 |
Correct |
158 ms |
28624 KB |
Output is correct |
23 |
Correct |
162 ms |
28436 KB |
Output is correct |
24 |
Correct |
168 ms |
28568 KB |
Output is correct |
25 |
Correct |
157 ms |
28552 KB |
Output is correct |
26 |
Correct |
169 ms |
28452 KB |
Output is correct |
27 |
Correct |
207 ms |
28352 KB |
Output is correct |
28 |
Correct |
120 ms |
31712 KB |
Output is correct |
29 |
Correct |
142 ms |
33344 KB |
Output is correct |
30 |
Correct |
125 ms |
30496 KB |
Output is correct |
31 |
Correct |
244 ms |
35260 KB |
Output is correct |
32 |
Correct |
630 ms |
45604 KB |
Output is correct |
33 |
Correct |
265 ms |
35740 KB |
Output is correct |
34 |
Correct |
344 ms |
36152 KB |
Output is correct |
35 |
Correct |
174 ms |
32760 KB |
Output is correct |
36 |
Correct |
112 ms |
30004 KB |
Output is correct |
37 |
Correct |
135 ms |
30924 KB |
Output is correct |
38 |
Correct |
205 ms |
31084 KB |
Output is correct |
39 |
Correct |
202 ms |
31152 KB |
Output is correct |
40 |
Correct |
204 ms |
31160 KB |
Output is correct |
41 |
Correct |
211 ms |
31248 KB |
Output is correct |
42 |
Correct |
210 ms |
31096 KB |
Output is correct |
43 |
Correct |
242 ms |
33892 KB |
Output is correct |
44 |
Correct |
253 ms |
33776 KB |
Output is correct |
45 |
Correct |
245 ms |
33992 KB |
Output is correct |
46 |
Correct |
259 ms |
33956 KB |
Output is correct |
47 |
Correct |
249 ms |
33824 KB |
Output is correct |
48 |
Correct |
323 ms |
32972 KB |
Output is correct |
49 |
Correct |
343 ms |
33096 KB |
Output is correct |
50 |
Correct |
310 ms |
33248 KB |
Output is correct |
51 |
Correct |
324 ms |
33308 KB |
Output is correct |
52 |
Correct |
324 ms |
32972 KB |
Output is correct |
53 |
Correct |
328 ms |
32924 KB |
Output is correct |
54 |
Correct |
317 ms |
33024 KB |
Output is correct |