Submission #1156110

#TimeUsernameProblemLanguageResultExecution timeMemory
1156110vladiliusFortune Telling 2 (JOI14_fortune_telling2)C++20
35 / 100
3095 ms94132 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define pb push_back
#define ff first
#define ss second
const int A = 1e9;

struct ST{
    struct node{
        node *l, *r;
        int s;
        node(){
            l = r = 0;
            s = 0;
        }
    };
    node *rt;
    void init(){
        rt = new node();
    }
    void add(node *v, int tl, int tr, int x){
        if (tl == tr){
            v -> s += 1;
            return;
        }
        int tm = (tl + tr) / 2;
        if (x <= tm){
            if (!(v -> l)) v -> l = new node();
            add(v -> l, tl, tm, x);
        }
        else {
            if (!(v -> r)) v -> r = new node();
            add(v -> r, tm + 1, tr, x);
        }
        v -> s = 0;
        if (v -> l) v -> s += v -> l -> s;
        if (v -> r) v -> s += v -> r -> s;
    }
    void add(int x){
        add(rt, 1, A, x);
    }
    int get(node *v, int tl, int tr, int l, int r){
        if (l > tr || r < tl) return 0;
        if (l <= tl && tr <= r) return v -> s;
        int tm = (tl + tr) / 2, out = 0;
        if (v -> l) out += get(v -> l, tl, tm, l, r);
        if (v -> r) out += get(v -> r, tm + 1, tr, l, r);
        return out;
    }
    int get(int x){
        return get(rt, 1, A, x, A);
    }
};

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int n, k; cin>>n>>k;
    vector<int> a(n + 1), b(n + 1);
    for (int i = 1; i <= n; i++){
        cin>>a[i]>>b[i];
    }
    vector<int> t(k + 1);
    vector<pii> all = {{}};
    for (int i = 1; i <= k; i++){
        cin>>t[i];
        all.pb({t[i], i});
    }
    
    sort(all.begin() + 1, all.end());
    vector<int> f(k + 1), p(k + 1);
    for (int i = 1; i <= k; i++){
        f[i] = all[i].ff;
        p[i] = all[i].ss;
    }
    
    auto get = [&](int l, int r){
        if (l > r) return 0;
        int out = 0;
        for (int i = l; i <= r; i++){
            out = max(out, p[i]);
        }
        return out;
    };
    
    vector<int> :: iterator it1, it2;
    
    vector<bool> h(n + 1);
    vector<pii> qs[k + 2];
    ll out = 0;
    for (int i = 1; i <= n; i++){
        if (a[i] == b[i]){
            out += a[i];
            continue;
        }
        if (a[i] < b[i]){
            it1 = lower_bound(f.begin() + 1, f.end(), a[i]);
            it2 = lower_bound(f.begin() + 1, f.end(), b[i]);
            
            int l = (int) (it1 - f.begin()), r = (int) (it2 - f.begin()) - 1, s = get(l, r);
            if (s) h[i] = 1;
            qs[s + 1].pb({i, b[i]});
        }
        else {
            it1 = lower_bound(f.begin() + 1, f.end(), b[i]);
            it2 = lower_bound(f.begin() + 1, f.end(), a[i]);
            
            int l = (int) (it1 - f.begin()), r = (int) (it2 - f.begin()) - 1, s = get(l, r);
            qs[s + 1].pb({i, a[i]});
        }
    }
    
    ST T; T.init();
    for (int i = k + 1; i > 0; i--){
        if (i <= k) T.add(t[i]);
        for (auto [ii, x]: qs[i]){
            int k = T.get(x);
            bool r = (k ^ h[ii]) % 2;
            out += (r) ? b[ii] : a[ii];
        }
    }
    
    cout<<out<<"\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...