Submission #1136000

#TimeUsernameProblemLanguageResultExecution timeMemory
1136000Hamed_GhaffariFortune Telling 2 (JOI14_fortune_telling2)C++20
100 / 100
377 ms59908 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long       ll;
typedef long double     ld;
typedef pair<int, int>  pii;
typedef pair<ll, ll>    pll;

#define X               first
#define Y               second
#define SZ(x)           int(x.size())
#define all(x)          x.begin(), x.end()
#define mins(a,b)       (a = min(a,b))
#define maxs(a,b)       (a = max(a,b))
#define pb              push_back
#define Mp              make_pair
#define kill(x)         {cout << (x) << '\n'; exit(0);}
#define killt(x)        {cout << (x) << '\n'; return;}
#define lc              id<<1
#define rc              lc|1
#define mid             ((l+r)/2)
mt19937_64              rng(chrono::steady_clock::now().time_since_epoch().count());

const ll  INF = 1e9 + 23;
const ll  MOD = 1e9 + 7;
const int MXN = 2e5 + 5;
const int MXM = 6e5 + 5;
const int LOG = 23;

int n, k, a[MXN], b[MXN], t[MXN];
vector<int> cmp;

int GI(int x) {
    return lower_bound(all(cmp), x)-cmp.begin();
}

int m, seg[MXM<<2];
void Build_seg(int l=0, int r=m, int id=1) {
    seg[id] = 0;
    if(r-l == 1) return;
    Build_seg(l, mid, lc);
    Build_seg(mid, r, rc);
}
void Upd_seg(int p, int x, int l=0, int r=m, int id=1) {
    if(r-l == 1) {
        seg[id] = x;
        return;
    }
    if(p<mid) Upd_seg(p, x, l, mid, lc);
    else Upd_seg(p, x, mid, r, rc);
    seg[id] = max(seg[lc], seg[rc]);
}
int Get_seg(int s, int e, int l=0, int r=m, int id=1) {
    if(s <= l && r <= e) return seg[id];
    return max(
        (s<mid ? Get_seg(s, e, l, mid, lc) : 0),
        (e>mid ? Get_seg(s, e, mid, r, rc) : 0)
    );
}

vector<int> mrg[MXN<<2];
void merge_sort(int l=1, int r=k+1, int id=1) {
    if(r-l == 1) {
        mrg[id] = {t[l]};
        return;
    }
    merge_sort(l, mid, lc);
    merge_sort(mid, r, rc);
    int i=0, j=0;
    while(i<SZ(mrg[lc]) && j<SZ(mrg[rc]))
        if(mrg[lc][i]<mrg[rc][j]) mrg[id].pb(mrg[lc][i++]);
        else mrg[id].pb(mrg[rc][j++]);
    while(i<SZ(mrg[lc])) mrg[id].pb(mrg[lc][i++]);
    while(j<SZ(mrg[rc])) mrg[id].pb(mrg[rc][j++]);
}
int Get_parity(int s, int e, int x, int l=1, int r=k+1, int id=1) {
    if(s <= l && r <= e) {
        int pos = lower_bound(all(mrg[id]), x)-mrg[id].begin();
        return (SZ(mrg[id])-pos)&1;
    }
    if(e<=mid) return Get_parity(s,e,x, l, mid, lc);
    if(s>=mid) return Get_parity(s,e,x, mid, r, rc);
    return Get_parity(s,e,x, l, mid, lc)^Get_parity(s,e,x, mid, r, rc);
}

void Main() {
    cin >> n >> k;
    for(int i=1; i<=n; i++) {
        cin >> a[i] >> b[i];
        cmp.pb(a[i]);
        cmp.pb(b[i]);
    }
    for(int i=1; i<=k; i++) {
        cin >> t[i];
        cmp.pb(t[i]);
    }
    sort(all(cmp));
    cmp.resize(unique(all(cmp))-cmp.begin());
    m = SZ(cmp);
    for(int i=1; i<=n; i++) {
        a[i] = GI(a[i]);
        b[i] = GI(b[i]);
    }
    Build_seg();
    for(int i=1; i<=k; i++) {
        t[i] = GI(t[i]);
        Upd_seg(t[i], i);
    }
    merge_sort();
    ll ans=0;
    for(int i=1; i<=n; i++) {
        if(a[i] != b[i]) {
            int pos = Get_seg(min(a[i], b[i]), max(a[i], b[i]));
            if(pos) {
                vector<int> vec = {max(a[i], b[i]), min(a[i], b[i])};
                ans += cmp[vec[pos<k && Get_parity(pos+1, k+1, max(a[i], b[i]))]];
            }
            else {
                vector<int> vec = {a[i], b[i]};
                ans += cmp[vec[Get_parity(1, k+1, max(a[i], b[i]))]];
            }
        }
        else ans += cmp[a[i]];
    }
    cout << ans << '\n';
}

int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    int T = 1;
    // cin >> T;
    while(T--) Main();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...