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
AC × 31
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