Submission #1624942
Source Code Expand
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cassert>
using namespace std;
using ll = long long;
template<class T> using V = vector<T>;
template<class T> using VV = V<V<T>>;
constexpr ll TEN(int n) { return (n==0) ? 1 : 10*TEN(n-1); }
int bsr(uint x) { return 31 - __builtin_clz(x); }
template<class T>
struct Fenwick {
int N, lg;
V<T> seg;
Fenwick() {}
Fenwick(int N) : N(N) {
seg = V<T>(N+1);
lg = bsr(uint(N));
fill(begin(seg), end(seg), T(0));
}
void add(int i, T x) {
i++;
while (i <= N) {
seg[i] += x;
i += i & -i;
}
}
T sum(int i) {
T s{0};
while (i > 0) {
s += seg[i];
i -= i & -i;
}
return s;
}
T sum(int a, int b) {
return sum(b) - sum(a);
}
};
const int MN = 100100;
struct D {
ll b, w;
};
ll C;
D d[MN];
D e[MN];
ll calc(int l, int r) {
if (l+1 == r) return 0;
int md = (l+r)/2;
int sl = l, tl = md;
int sr = md, tr = r;
ll sm = calc(sl, tl) + calc(sr, tr);
V<ll> v;
for (int i = sr; i < tr; i++) {
v.push_back(d[i].w);
}
sort(begin(v), end(v));
v.erase(unique(begin(v), end(v)), end(v));
int U = int(v.size());
auto getI = [&](ll x) {
return lower_bound(begin(v), end(v), x) - begin(v);
};
Fenwick<ll> fw1(U), fww(U);
int cnt = l;
V<D> back;
while (true) {
bool f1 = (sl == tl);
bool f2 = (sr == tr);
bool f3 = !f1 & !f2;
if (f1 & f2) break;
if (f2 || (f3 && d[sl].b < d[sr].b)) {
D x = d[sl];
/* ll sm1 = 0;
for (D y: back) {
sm1 += max(x.w, y.w);
sm1 += min(x.w, y.w) * C;
}
sm += sm1;*/
int p = getI(x.w);
ll sm2 = 0;
//x<=y, min
sm2 += fw1.sum(p, U) * x.w * C;
//x<=y, max
sm2 += fww.sum(p, U);
//y<=x, min
sm2 += fww.sum(0, p) * C;
//y<=x, max
sm2 += fw1.sum(0, p) * x.w;
// cout << sm1 << ", " << sm2 << endl;
sm += sm2;
e[cnt++] = d[sl++];
} else if (f1 || (f3 && d[sl].b > d[sr].b)) {
back.push_back(d[sr]);
fw1.add(getI(d[sr].w), 1);
fww.add(getI(d[sr].w), d[sr].w);
e[cnt++] = d[sr++];
} else {
assert(false);
}
}
assert(cnt == r);
copy_n(e+l, r-l, d+l);
return sm;
}
int main() {
int n;
cin >> n >> C;
for (int i = 0; i < n; i++) {
ll b, w;
cin >> b >> w;
d[i] = D{b, w};
}
cout << calc(0, n) << endl;
/*
for (int i = 0; i < n; i++) {
cout << d[i].b << ", " << d[i].w << endl;
}*/
return 0;
}
Submission Info
| Submission Time |
|
| Task |
I - Librarian's Work |
| User |
zenkan_rta |
| Language |
C++14 (Clang 3.8.0) |
| Score |
100 |
| Code Size |
3018 Byte |
| Status |
AC |
| Exec Time |
420 ms |
| Memory |
6304 KiB |
Judge Result
| Set Name |
All |
| Score / Max Score |
100 / 100 |
| Status |
|
| Set Name |
Test Cases |
| All |
00_sample_01, 00_sample_02, 00_sample_03, 10_small_0, 10_small_1, 10_small_2, 10_small_3, 10_small_4, 10_small_5, 10_small_6, 10_small_7, 20_large_0, 20_large_1, 20_large_2, 20_large_3, 20_large_4, 20_large_5, 20_large_6, 20_large_7, 30_maximum_0, 30_maximum_1, 30_maximum_2, 30_maximum_3, 50_sorted_0, 50_sorted_1, 50_sorted_2, 50_sorted_3, 60_reverse_sorted_0, 60_reverse_sorted_1, 60_reverse_sorted_2, 60_reverse_sorted_3 |
| Case Name |
Status |
Exec Time |
Memory |
| 00_sample_01 |
AC |
2 ms |
384 KiB |
| 00_sample_02 |
AC |
1 ms |
256 KiB |
| 00_sample_03 |
AC |
1 ms |
256 KiB |
| 10_small_0 |
AC |
1 ms |
256 KiB |
| 10_small_1 |
AC |
1 ms |
256 KiB |
| 10_small_2 |
AC |
1 ms |
256 KiB |
| 10_small_3 |
AC |
1 ms |
256 KiB |
| 10_small_4 |
AC |
1 ms |
256 KiB |
| 10_small_5 |
AC |
1 ms |
256 KiB |
| 10_small_6 |
AC |
1 ms |
256 KiB |
| 10_small_7 |
AC |
1 ms |
256 KiB |
| 20_large_0 |
AC |
382 ms |
5992 KiB |
| 20_large_1 |
AC |
203 ms |
3248 KiB |
| 20_large_2 |
AC |
130 ms |
2512 KiB |
| 20_large_3 |
AC |
132 ms |
2624 KiB |
| 20_large_4 |
AC |
98 ms |
1836 KiB |
| 20_large_5 |
AC |
290 ms |
4840 KiB |
| 20_large_6 |
AC |
36 ms |
912 KiB |
| 20_large_7 |
AC |
1 ms |
256 KiB |
| 30_maximum_0 |
AC |
416 ms |
6252 KiB |
| 30_maximum_1 |
AC |
417 ms |
6292 KiB |
| 30_maximum_2 |
AC |
420 ms |
6252 KiB |
| 30_maximum_3 |
AC |
413 ms |
6304 KiB |
| 50_sorted_0 |
AC |
4 ms |
256 KiB |
| 50_sorted_1 |
AC |
145 ms |
2792 KiB |
| 50_sorted_2 |
AC |
124 ms |
2588 KiB |
| 50_sorted_3 |
AC |
326 ms |
5528 KiB |
| 60_reverse_sorted_0 |
AC |
140 ms |
2692 KiB |
| 60_reverse_sorted_1 |
AC |
283 ms |
4840 KiB |
| 60_reverse_sorted_2 |
AC |
235 ms |
3668 KiB |
| 60_reverse_sorted_3 |
AC |
162 ms |
2944 KiB |