Submission #1370500

#TimeUsernameProblemLanguageResultExecution timeMemory
1370500hanguyendanghuyFortune Telling 2 (JOI14_fortune_telling2)C++20
100 / 100
320 ms52240 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(),x.end()
constexpr ll MAXN=6e5+5,MOD=998244353,INF=1e18;
ll n,m,i,j,p,k,t,ans,st,en,b[MAXN],luu[MAXN],ma[MAXN],out[MAXN],state[MAXN],sz;
struct h{
    ll a,b,id,ida,idb;
} a[MAXN];
bool cmp(h x,h y){
    return ma[x.id]>ma[y.id];
}
bool cmp1(h x,h y){
    return x.id<y.id;
}
struct seg{
    ll b[4*MAXN],cnt[4*MAXN];
    void update(ll in,ll l,ll r,ll pos,ll val){
        if(l>pos||r<pos) return;
        else if(l==r&&r==pos){
            b[in]=max(b[in],val);
        }
        else{
            ll m=(l+r)>>1;
            update(in*2,l,m,pos,val);
            update(in*2+1,m+1,r,pos,val);
            b[in]=max(b[in*2],b[in*2+1]);
        }
    }
    ll get(ll in,ll l,ll r,ll l1,ll r1){
        if(l>r1||r<l1) return 0;
        else if(l>=l1&&r<=r1){
            return b[in];
        }
        else{
            ll m=(l+r)>>1;
            return max(get(in*2,l,m,l1,r1),get(in*2+1,m+1,r,l1,r1));
        }
    }
    void update1(ll in,ll l,ll r,ll pos){
        if(l>pos||r<pos) return;
        else if(l==r&&r==pos){
            cnt[in]++;
        }
        else{
            ll m=(l+r)>>1;
            update1(in*2,l,m,pos);
            update1(in*2+1,m+1,r,pos);
            cnt[in]=cnt[in*2]+cnt[in*2+1];
        }
    }
    ll get1(ll in,ll l,ll r,ll l1,ll r1){
        if(l>r1||r<l1) return 0;
        else if(l>=l1&&r<=r1){
            return cnt[in];
        }
        else{
            ll m=(l+r)>>1;
            return get1(in*2,l,m,l1,r1)+get1(in*2+1,m+1,r,l1,r1);
        }
    }
} seg;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    // freopen("ILIGHT.INP","r",stdin);
    // freopen("ILIGHT.OUT","w",stdout);
    cin>>n>>m;
    vector<ll> nen;
    for(i=1;i<=n;i++){
        cin>>a[i].a>>a[i].b;
        a[i].id=i;
        nen.pb(a[i].a);
        nen.pb(a[i].b);
        if(a[i].a>a[i].b){
            swap(a[i].a,a[i].b);
            state[i]=1;
        }
    }
    for(i=1;i<=m;i++){
        cin>>b[i];
        nen.pb(b[i]);
    }
    sort(all(nen));
    nen.erase(unique(all(nen)),nen.end());
    sz=nen.size();
    for(i=1;i<=n;i++){
        a[i].ida=lower_bound(all(nen),a[i].a)-nen.begin()+1;
        a[i].idb=lower_bound(all(nen),a[i].b)-nen.begin()+1;
    }
    for(i=1;i<=m;i++){
        b[i]=lower_bound(all(nen),b[i])-nen.begin()+1;
        seg.update(1,1,sz,b[i],i);
    }
    for(i=1;i<=n;i++){
        ma[a[i].id]=seg.get(1,1,sz,a[i].ida,a[i].idb-1);
        if(ma[a[i].id])
            ma[a[i].id]++;
    }
    sort(a+1,a+n+1,cmp);
    ll cnt=1;
    while(cnt<=n&&ma[a[cnt].id]>m)
        cnt++;
    for(i=m;i>=1;i--){
        seg.update1(1,1,sz,b[i]);
        while(cnt<=n&&ma[a[cnt].id]==i){
            out[a[cnt].id]=seg.get1(1,1,sz,a[cnt].idb,sz);
            cnt++;
        }
    }
    sort(a+1,a+n+1,cmp1);
    ll ans=0;
    for(i=1;i<=n;i++){
        if(ma[i]>0&&ma[i]<=m){
            ans+=(out[i]&1?a[i].a:a[i].b);
        }
        else if(!ma[i]){
            out[i]=seg.get1(1,1,sz,a[i].idb,sz);
            if(!state[i])
                ans+=(out[i]&1?a[i].b:a[i].a);
            else ans+=(out[i]&1?a[i].a:a[i].b);
        }
        else{
            ans+=max(a[i].a,a[i].b);
        }
        // cout<<out[i]<<" "<<ans<<'\n';
    }
    cout<<ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...