Submission #1364106

#TimeUsernameProblemLanguageResultExecution timeMemory
1364106daotuankhoiFortune Telling 2 (JOI14_fortune_telling2)C++20
100 / 100
106 ms9364 KiB
#include <bits/stdc++.h>

using namespace std;

#define fi first
#define se second
#define ll long long

#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif

template <class T> bool ckmax(T &a, T b) { return a < b ? (a = b, true) : false; }
template <class T> bool ckmin(T &a, T b) { return a > b ? (a = b, true) : false; }

const int MAXN = 2e5 + 5;

int a[MAXN], b[MAXN];
int n, k;

pair<int, int> st[MAXN * 4];

void upd(int pos, int val) {
    int l = 1, r = k, id = 1;
    while (l < r) {
        int mid = (l + r) >> 1;
        if (pos <= mid) r = mid, id = id << 1;
        else l = mid + 1, id = id << 1 | 1;
    }
    st[id] = {val, 1};
    while (id > 1) {
        id >>= 1;
        st[id].fi = min(st[id << 1].fi, st[id << 1 | 1].fi);
        st[id].se = st[id << 1].se ^ st[id << 1 | 1].se;
    }
}
void build(int id = 1, int l = 1, int r = k) {
    st[id] = {1e9, 0};
    if (l == r) return;
    int mid = (l + r) >> 1;
    build(id << 1, l, mid);
    build(id << 1 | 1, mid + 1, r);
}


int get(int id, int l, int r, int u, int v) {
    if (v < l || r < u) return 0;
    if (u <= l && r <= v) return st[id].se;
    int mid = (l + r) >> 1;
    return get(id << 1, l, mid, u, v) ^ get(id << 1 | 1, mid + 1, r, u, v);
}

int walk(int id, int l, int r, int v) {
    if (st[id].fi > v) return 0;
    if (l == r) return l;
    int mid = (l + r) >> 1;
    int p = walk(id << 1 | 1, mid + 1, r, v);
    if (p) return p;
    return walk(id << 1, l, mid, v);
}

int main() {
    #define NAME ""
    if (fopen(NAME".inp", "r")) {
        freopen(NAME".inp", "r", stdin);
        freopen(NAME".out", "w", stdout);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> k;
    vector<pair<int, int>> v;
    ll ans = 0;
    for (int i = 1; i <= n; i++) {
        cin >> a[i] >> b[i];
        if (a[i] == b[i]) {
            ans += a[i];
            continue;
        }
        v.emplace_back(min(a[i], b[i]), i);
    }
    for (int i = 1, x; i <= k; i++) {
        cin >> x;
        v.emplace_back(x, i + n);
    }
    build();
    sort(v.begin(), v.end(), greater<pair<int, int>>());
    for (auto [mn, id] : v) {
        if (id > n) upd(id - n, mn);
        else {
            int mx = max(a[id], b[id]);
            int pos = walk(1, 1, k, mx - 1);
            if (pos != 0) {
                a[id] = mx;
                b[id] = mn;
            }
            if (get(1, 1, k, pos + 1, k)) swap(a[id], b[id]);
            ans += a[id];
        }
    }
    cout << ans << '\n';
    return 0;
}

Compilation message (stderr)

fortune_telling2.cpp: In function 'int main()':
fortune_telling2.cpp:67:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   67 |         freopen(NAME".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
fortune_telling2.cpp:68:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |         freopen(NAME".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...