P4698 [CEOI2011]Hotel

· · 题解

代码部分:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=5e5+5;
ll ans,icm[maxn];
int n,m,o,sum,pre[maxn],tot;
bool mark[maxn];

struct node {
    int x,y;
} a[maxn],b[maxn];

bool cmp1(node a,node b) {
    if(a.y==b.y)return a.x>b.x;
    return a.y>b.y;
}

bool cmp2(node a,node b) {
    if(a.x==b.x)return a.y>b.y;
    return a.x>b.x;
}

int find(int x) {
    return pre[x]==x?x:pre[x]=find(pre[x]);
}

int main() {
    scanf("%d%d%d",&n,&m,&o);
    for(int i=1; i<=n; i++)scanf("%d%d",&a[i].x,&a[i].y),pre[i]=i;
    for(int i=1; i<=m; i++)scanf("%d%d",&b[i].x,&b[i].y);
    sort(a+1,a+n+1,cmp1);
    sort(b+1,b+m+1,cmp2);
    for(int i=1; i<=m; i++) {
        int l=1,r=n,res=-1;
        while(l<=r) {
            int mid=l+r>>1;
            if(a[mid].y>=b[i].y)l=mid+1,res=mid;
            else r=mid-1;
        }
        if(res==-1)continue;
        if(!mark[res]) {
            if(b[i].x-a[res].x<=0)continue;
            mark[res]=1,pre[res]=res-1,icm[++tot]=b[i].x-a[res].x;
        } else {
            int fa=find(res);
            if(!fa)continue;
            if(b[i].x-a[fa].x<=0)continue;
            mark[fa]=1,pre[fa]=fa-1,icm[++tot]=b[i].x-a[fa].x;
        }
    }
    sort(icm+1,icm+tot+1);
    for(int i=tot; i>=1; i--) {
        if(sum==o)break;
        ans+=icm[i];
        sum++;
    }
    printf("%lld\n",ans);
    return 0;
}