#include <bits/stdc++.h>
#define ll long long
#define vc vector
using namespace std;
struct segtr{
struct node{
node* lc=0,* rc=0;
ll sum=0,sum2=0, upd=0, l, r, mid;
node(ll l_, ll r_):l(l_), r(r_){mid=l+r;if(mid<0)--mid;mid/=2;}
~node(){if(lc)delete lc; if(rc)delete rc;}
inline ll getlen(){return r-l+1;}
inline ll getsum(){return sum+upd*getlen();}
inline ll getsum2(){return sum2+upd*getlen()*(getlen()+1)/2;}
void push(){
if(!lc) lc=new node(l, mid);
if(!rc) rc=new node(mid+1, r);
if(upd){lc->upd+=upd, rc->upd+=upd;upd=0;}
}
void updsums(){
sum=lc->getsum()+rc->getsum();
sum2=lc->getsum2()+lc->getsum()*rc->getlen()+rc->getsum2();
}
};
node* root;
ll n;
void update_w(ll ql, ll qr, node* no){
assert(ql<=qr && -n<=ql && qr<=n);
if(ql==no->l && qr==no->r) ++no->upd;
else{
no->push();
if(qr<=no->mid) update_w(ql, qr, no->lc);
else if(no->mid<ql) update_w(ql, qr, no->rc);
else update_w(ql, no->mid, no->lc), update_w(no->mid+1, qr, no->rc);
no->updsums();
}
}
void update(ll ql, ll qr){update_w(ql, qr, root);}
pair<ll, ll> query(ll ql, ll qr, node* no){
assert(ql<=qr && -n<=ql && qr<=n);
if(ql==no->l && qr==no->r) return make_pair(no->getsum(), no->getsum2());
else{
pair<ll, ll> ret;
no->push();
if(qr<=no->mid) ret=query(ql, qr, no->lc);
else if(no->mid<ql) ret=query(ql, qr, no->rc);
else{
auto r1=query(ql, no->mid, no->lc);
auto r2=query(no->mid+1, qr, no->rc);
ret=make_pair(r1.first+r2.first, r1.second+r1.first*(qr-no->mid)+r2.second);
}
no->updsums();
return ret;
}
}
ll get(ll ql, ll qr){
assert(ql<=qr);
assert(-n<=ql);
assert(qr<=n);
return query(-n, ql-1, root).first*(qr-ql+1)+query(ql, qr, root).second;
}
segtr(ll n_): n(n_){root=new node(-n, n);}
~segtr(){
delete root;
}
};
int main() {
segtr sg(10);
sg.update(2, 6);
//cout << sg.query(3, 6, sg.root).second<<endl;
//cout << sg.query(-1, 7, sg.root).first<<endl;
ll n; cin >> n;
vc<ll> a(n+1);for(ll i=1;i<=n;++i) cin >> a[i];
map<ll, vc<ll>> poss; for(ll i=1;i<=n;++i) poss[a[i]].push_back(i);
ll ans=0;
for(auto [key, pos]: poss){
segtr sg(n+4);
pos.insert(pos.begin(), 0);
ll cur=0;sg.update(0, 0);
for(ll i=0;i+1<pos.size();++i){
ll d=pos[i+1]-pos[i]-1; assert(d>=0);
if(d>0)ans+=sg.get(cur-d-1, cur-2), sg.update(cur-d, cur-1);
cur-=d;
++cur;
ans+=sg.get(cur-1, cur-1);
sg.update(cur, cur);
}
ll d=n+1-pos.back()-1;
if(d>0)ans+=sg.get(cur-d-1, cur-2);
cur-=d;
}
cout << ans << endl;
}
Compilation message
Main.cpp: In function 'int main()':
Main.cpp:81:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
81 | for(auto [key, pos]: poss){
| ^
Main.cpp:85:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
85 | for(ll i=0;i+1<pos.size();++i){
| ~~~^~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
1 ms |
212 KB |
Output is correct |
5 |
Correct |
1 ms |
212 KB |
Output is correct |
6 |
Correct |
1 ms |
340 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
1 ms |
212 KB |
Output is correct |
5 |
Correct |
1 ms |
212 KB |
Output is correct |
6 |
Correct |
1 ms |
340 KB |
Output is correct |
7 |
Correct |
4 ms |
340 KB |
Output is correct |
8 |
Correct |
1 ms |
212 KB |
Output is correct |
9 |
Correct |
4 ms |
468 KB |
Output is correct |
10 |
Correct |
4 ms |
468 KB |
Output is correct |
11 |
Correct |
4 ms |
468 KB |
Output is correct |
12 |
Correct |
4 ms |
468 KB |
Output is correct |
13 |
Correct |
4 ms |
468 KB |
Output is correct |
14 |
Correct |
4 ms |
468 KB |
Output is correct |
15 |
Correct |
4 ms |
468 KB |
Output is correct |
16 |
Correct |
4 ms |
468 KB |
Output is correct |
17 |
Correct |
3 ms |
596 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
122 ms |
3452 KB |
Output is correct |
2 |
Correct |
156 ms |
4552 KB |
Output is correct |
3 |
Correct |
91 ms |
2800 KB |
Output is correct |
4 |
Correct |
166 ms |
4672 KB |
Output is correct |
5 |
Correct |
177 ms |
4872 KB |
Output is correct |
6 |
Correct |
181 ms |
5180 KB |
Output is correct |
7 |
Correct |
183 ms |
5184 KB |
Output is correct |
8 |
Correct |
177 ms |
5044 KB |
Output is correct |
9 |
Correct |
185 ms |
5136 KB |
Output is correct |
10 |
Correct |
179 ms |
5084 KB |
Output is correct |
11 |
Correct |
165 ms |
36224 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
1 ms |
212 KB |
Output is correct |
5 |
Correct |
1 ms |
212 KB |
Output is correct |
6 |
Correct |
1 ms |
340 KB |
Output is correct |
7 |
Correct |
4 ms |
340 KB |
Output is correct |
8 |
Correct |
1 ms |
212 KB |
Output is correct |
9 |
Correct |
4 ms |
468 KB |
Output is correct |
10 |
Correct |
4 ms |
468 KB |
Output is correct |
11 |
Correct |
4 ms |
468 KB |
Output is correct |
12 |
Correct |
4 ms |
468 KB |
Output is correct |
13 |
Correct |
4 ms |
468 KB |
Output is correct |
14 |
Correct |
4 ms |
468 KB |
Output is correct |
15 |
Correct |
4 ms |
468 KB |
Output is correct |
16 |
Correct |
4 ms |
468 KB |
Output is correct |
17 |
Correct |
3 ms |
596 KB |
Output is correct |
18 |
Correct |
122 ms |
3452 KB |
Output is correct |
19 |
Correct |
156 ms |
4552 KB |
Output is correct |
20 |
Correct |
91 ms |
2800 KB |
Output is correct |
21 |
Correct |
166 ms |
4672 KB |
Output is correct |
22 |
Correct |
177 ms |
4872 KB |
Output is correct |
23 |
Correct |
181 ms |
5180 KB |
Output is correct |
24 |
Correct |
183 ms |
5184 KB |
Output is correct |
25 |
Correct |
177 ms |
5044 KB |
Output is correct |
26 |
Correct |
185 ms |
5136 KB |
Output is correct |
27 |
Correct |
179 ms |
5084 KB |
Output is correct |
28 |
Correct |
165 ms |
36224 KB |
Output is correct |
29 |
Correct |
214 ms |
36320 KB |
Output is correct |
30 |
Correct |
181 ms |
4428 KB |
Output is correct |
31 |
Correct |
381 ms |
7852 KB |
Output is correct |
32 |
Correct |
978 ms |
16724 KB |
Output is correct |
33 |
Correct |
405 ms |
8872 KB |
Output is correct |
34 |
Correct |
444 ms |
9228 KB |
Output is correct |
35 |
Correct |
282 ms |
6468 KB |
Output is correct |
36 |
Correct |
159 ms |
4128 KB |
Output is correct |
37 |
Correct |
205 ms |
4884 KB |
Output is correct |
38 |
Correct |
304 ms |
18336 KB |
Output is correct |
39 |
Correct |
311 ms |
18336 KB |
Output is correct |
40 |
Correct |
310 ms |
18412 KB |
Output is correct |
41 |
Correct |
300 ms |
18420 KB |
Output is correct |
42 |
Correct |
310 ms |
18436 KB |
Output is correct |
43 |
Correct |
430 ms |
17980 KB |
Output is correct |
44 |
Correct |
430 ms |
18200 KB |
Output is correct |
45 |
Correct |
421 ms |
17868 KB |
Output is correct |
46 |
Correct |
428 ms |
17964 KB |
Output is correct |
47 |
Correct |
420 ms |
17956 KB |
Output is correct |
48 |
Correct |
528 ms |
6604 KB |
Output is correct |
49 |
Correct |
533 ms |
6476 KB |
Output is correct |
50 |
Correct |
511 ms |
8780 KB |
Output is correct |
51 |
Correct |
487 ms |
8764 KB |
Output is correct |
52 |
Correct |
600 ms |
5416 KB |
Output is correct |
53 |
Correct |
577 ms |
5196 KB |
Output is correct |
54 |
Correct |
539 ms |
5952 KB |
Output is correct |