제출 #1328002

#제출 시각아이디문제언어결과실행 시간메모리
1328002nguyenkhangninh99운세 보기 2 (JOI14_fortune_telling2)C++20
100 / 100
335 ms34672 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
vector<int> compress;
int f(int u){
    return lower_bound(compress.begin(), compress.end(), u) - compress.begin() + 1;
}

const int maxn = 1e6 + 5;
int bit[maxn];

void incr(int p, int x){
    for(; p < maxn; p +=p & -p) bit[p] += x;
}
int get(int p){
    int sum = 0;
    for(; p; p -= p & -p) sum += bit[p];
    return sum;
}
int st[4 * maxn];
int mxqry(int id, int l, int r, int u, int v){
    if(l > v || r < u) return 0;
    if(u <= l && r <= v) return st[id];
    int mid = (l + r) / 2;
    return max(mxqry(id * 2, l, mid, u, v), mxqry(id * 2 + 1, mid + 1, r, u, v));
}

void update(int id, int l, int r, int pos, int val){
    if(l == r) st[id] = max(st[id], val);
    else{
        int mid = (l + r) / 2;
        if(pos <= mid) update(id * 2, l, mid, pos, val);
        else update(id * 2 + 1, mid + 1, r, pos, val);
        st[id] = max(st[id * 2], st[id * 2 + 1]);
    }
}

vector<pair<int, int>> qry[maxn];
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    
    int n, k; cin >> n >> k;

    vector<int> a(n + 1), b(n + 1), T(k + 1), state(n + 1);
    for(int i = 1; i <= n; i++){
        cin >> a[i] >> b[i];
        compress.push_back(a[i]);
        compress.push_back(b[i] - 1);
        if(a[i] > b[i]){
            state[i] = 1;
            swap(a[i], b[i]);
        }
    }
    for(int i = 1; i <= k; i++){
        cin >> T[i];
        compress.push_back(T[i]);
    }

    sort(compress.begin(), compress.end());
    compress.erase(unique(compress.begin(), compress.end()), compress.end());

    for(int i = 1; i <= k; i++){
        T[i] = f(T[i]);
        update(1, 1, maxn - 1, T[i], i);
    }
    vector<int> res(n + 1);
    for(int i = 1; i <= n; i++){
        int tmp = f(b[i] - 1);
        res[i] = mxqry(1, 1, maxn - 1, f(a[i]), tmp);
        if(res[i]) state[i] = 1; //thg lớn hơn đang ở trên
        qry[res[i]].push_back({i, tmp});
    }

    vector<int> ans(n + 1);
    for(int i = k; i >= 0; i--){
        if(i) incr(T[i], 1);
        for(auto [id, r]: qry[i]) ans[id] = k - i + (i != 0) - get(r);
    }
    int sum = 0;
    for(int i = 1; i <= n; i++){
        if((state[i] + ans[i]) % 2 == 0) sum += a[i];
        else sum += b[i];
    }
    cout << sum;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...