Submission #1345269

#TimeUsernameProblemLanguageResultExecution timeMemory
1345269Rafael_Augusto운세 보기 2 (JOI14_fortune_telling2)C++20
100 / 100
96 ms14656 KiB
#include <bits/stdc++.h>
using namespace std;

// Muito cuidado por aqui ↓
#define int long long
#define pb push_back
#define f first
#define s second
#define all(v) v.begin(), v.end()
#define dbg(v) cerr << #v << " = " << v << "\n"
#define fall(i, s, n) for(int i=s; i<n; i++)
#define rfall(i, s, n) for(int i=s; i>=n; i--)

typedef pair<int, int> pii;
typedef tuple<int, int, int> trio;
typedef tuple<int, int, int, int> squad;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const int MAXN = 2e5+7;

int bit[MAXN];

void upd(int x, int v){
    while(x < MAXN) bit[x] += v, x += x&-x;
}

int qry(int x){
    int sum=0;

    while(x) sum += bit[x], x -= x&-x;

    return sum;
}

int32_t main(){
    ios::sync_with_stdio(0); cin.tie(0);

    int n, k; cin >> n >> k;

    int a[n+1], b[n+1];

    vector<pii> v;
    
    fall(i, 1, n+1){
        cin >> a[i] >> b[i];

        v.pb({max(a[i], b[i]), i});
    }

    int q[k+1];

    fall(i, 1, k+1){
        int a, b; cin >> a, b=i;

        v.pb({a, n+b});

        q[i]=a;
    }

    sort(all(v));

    set<pii> st;

    int lst[n+1];

    for(auto [x, j] : v){
        if(j >= n+1){// min/max queue
            st.insert({x, j-n});

            while(st.find({x, j-n}) != st.begin()){
                auto it = st.find({x, j-n}); it--;

                if((*it).f <= x && (*it).s < j-n) st.erase(it);
                else break;
            }
        }else{
            auto it = st.lower_bound({min(a[j], b[j]), -1});

            if(it == st.end()) lst[j]=0;
            else lst[j]=(*it).s;
        }
    }

    fall(i, 1, n+1) if(lst[i] && a[i] < b[i]) swap(a[i], b[i]);

    fall(i, 1, k+1) upd(i, 1);

    int sum=0;

    for(auto [x, j] : v){
        if(j >= n+1) upd(j-n, -1);
        else{
            int t = qry(MAXN-1)-qry(lst[j]);

            if(t%2) sum += b[j];
            else sum += a[j];
        }
    }

    cout << sum << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...