题目链接

https://codeforces.com/problemset/problem/556/D

解题思路

贪心+点匹配区间问题
点匹配区间问题例题及讲解
不想多说了,感觉挺板子的。
特别注意输出是“Yes”/“No”,而不是“YES”/“NO”!!!

AC代码

#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
using namespace std;

const int N=2e5+5;

typedef pair<ll,int> pli;
priority_queue<pli,vector<pli>,greater<pli> > q;

int n,m,ans,cnt=1,res[N];
ll r[N],l[N];

struct node
{
    ll l,r;
    int idx;    
}a[N],b[N];

bool cmp(node c,node d)
{
    return c.l<d.l;
}

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) 
    {
        cin>>l[i]>>r[i];
        if(i==1) continue;
        a[i-1].l=l[i]-r[i-1];
        a[i-1].r=r[i]-l[i-1];
        a[i-1].idx=i-1;
    }
    for(int i=1;i<=m;i++) cin>>b[i].l,b[i].idx=i;
    n--;

    sort(a+1,a+n+1,cmp);
    sort(b+1,b+m+1,cmp);

    for(int i=1;i<=m;i++)
    {
        while(cnt<=n && a[cnt].l<=b[i].l) q.push(pli(a[cnt].r,cnt)),++cnt;
        while(!q.empty())
        {
            ll tmp=q.top().fi;int id=q.top().se;q.pop();
            if(tmp>=b[i].l)
            {
                ++ans,res[a[id].idx]=b[i].idx;
                break;
            } 
        }
    }
    if(ans>=n) 
    {
        puts("Yes");
        for(int i=1;i<=n;i++)
        cout<<res[i]<<(i==n?'\n':' ');
    }
    else puts("No");
}