제출 #1219002

#제출 시각아이디문제언어결과실행 시간메모리
1219002Sofiatpc운세 보기 2 (JOI14_fortune_telling2)C++20
0 / 100
0 ms320 KiB
#include <bits/stdc++.h>

using namespace std;

#define fi first
#define sc second
const int MAXN = 2*1e5+5;
pair<int,int> p[MAXN], t[MAXN];
int mx[MAXN*4], id[MAXN], bit[MAXN], k;

bool cmp(pair<int,int> a, pair<int,int> b){return max(a.fi,a.sc) < max(b.fi,b.sc);}

void update(int node, int l, int r, int i, int x){
    if(i < l || r < i)return;
    if(l == r){
        mx[node] = x;
        return;
    }

    int mid = (l+r)/2 , e = node*2, d = node*2+1;
    update(e,l,mid,i,x); update(d,mid+1,r,i,x);
    mx[node] = max(mx[e], mx[d]);
}

int bb(int node, int l, int r, int x){
    if(l == r){
        if(mx[node] < x)return -1;
        return l;
    }

    int mid = (l+r)/2 , e = node*2, d = node*2+1;
    if(mx[d] >= x)return bb(d,mid+1,r,x);
    return bb(e,l,mid,x);
}

void updateB(int i, int x){
    for(; i <= k; i += i&-i)
        bit[i] += x;
}

int queryB(int i){
    if(i < 1)return 0;
    int ans = 0;
    for(; i > 0; i -= i&-i)
        ans += bit[i];
    return ans;
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n; cin>>n>>k;
    for(int i = 1; i <= n; i++)cin>>p[i].fi>>p[i].sc;

    sort(p+1,p+1+n, cmp);

    for(int i = 1; i <= k; i++){
        cin>>t[i].fi;
        t[i].sc = i;
    }

    sort(t+1,t+1+k);

    int cur = 1;
    for(int i = 1; i <= k; i++){
        while(cur <= n && max(p[cur].fi,p[cur].sc) <= t[i].fi){
            id[cur] = bb(1,1,k, min(p[cur].fi,p[cur].sc));
            cur++;
        }

        update(1,1,k, t[i].sc, t[i].fi);
    }
    while(cur <= n){
        id[cur] = bb(1,1,k, min(p[cur].fi,p[cur].sc));
        cur++;
    }

    cur = n;
    int ans = 0;
    for(int i = k; i >= 1; i--){
        while(cur > 0 && max(p[cur].fi,p[cur].sc) > t[i].fi){
            int x = queryB(k) - queryB(id[cur]);
            if(id[cur] == -1){
                if(x%2 == 0)ans += p[cur].fi;
                else ans += p[cur].sc;
            }else{
                if(x%2 == 0)ans += max(p[cur].fi, p[cur].sc);
                else ans += min(p[cur].fi, p[cur].sc);
            }


            cur--;
        }

        updateB(t[i].sc, 1);
    }
    while(cur > 0){
        int x = queryB(k) - queryB(id[cur]);
        if(id[cur] == -1){
            if(x%2 == 0)ans += p[cur].fi;
            else ans += p[cur].sc;
        }else{
            if(x%2 == 0)ans += max(p[cur].fi, p[cur].sc);
            else ans += min(p[cur].fi, p[cur].sc);
        }

        cur--;
    }

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