贪心+二分。
将桥的合法范围进行排序,二分查找对应的桥。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=200200;
struct seg
{
long long mn,mx;
}bdg[MAXN];
bool cmp(seg s1,seg s2)
{
if(s1.mx!=s2.mx)
return s1.mx<s2.mx;
else
return s1.mn<s2.mn;
}
multiset<long long> st;
multiset<long long> ::iterator it;
int main()
{
long long n,m,i,flag,l,r,befl,befr,a;
while(scanf("%lld%lld",&n,&m)!=EOF)
{
st.clear();
scanf("%lld%lld",&befl,&befr);
for(i=0;i<n-1;i++)
{
scanf("%lld%lld",&l,&r);
bdg[i].mn=l-befr;
bdg[i].mx=r-befl;
befl=l;
befr=r;
}
n--;
sort(bdg,bdg+n,cmp);
for(i=0;i<m;i++)
{
scanf("%lld",&a);
st.insert(a);
}
flag=1;
for(i=0;i<n;i++)
{
it=st.lower_bound(bdg[i].mn);
if(it==st.end()||(*it)>bdg[i].mx)
{
flag=0;
break;
}
st.erase(it);
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
}