51NOD 1460
中文题意我就不描述了。。。
被这题坑了好久
一开始还以为是图论题目,最后想到了是贪心题目
然后尝试了很多方法
最后我用的是将每一段的约束条件先处理出来,然后按照左边大到小排序,然后每次找右边满足条件的,进行判断。。。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define ROF(i,a,b) for(int i=a;i>=b;i--)
#define mem(i,a) memset(i,a,sizeof(i))
#define rson mid+1,r,rt<<1|1
#define lson l,mid,rt<<1
#define mp make_pair
#define pb push_back
#define ll long long
#define LL long long
using namespace std;
template <typename T>inline void read(T &_x_){
_x_=0;bool f=false;char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=!f;ch=getchar();}
while ('0'<=ch&&ch<='9') {_x_=_x_*10+ch-'0';ch=getchar();}
if(f) _x_=-_x_;
}
const double eps = 1e-8;
const int maxn = 2e5+7;
const int mod = 1e9+7;
const ll inf = 1e15;
ll n,m,x,y;
struct node{
ll x,y;
}a[maxn],md[maxn];
bool cmp(const node&c,const node&d){
if(c.x!=d.x) return c.x>d.x;
return c.y>d.y;
}
multiset<ll> ms;
bool solve(){
for(int i=2;i<=n;i++){
multiset<ll>::iterator it = ms.lower_bound(md[i].y);
if(it==ms.end()) it--;
if(it==ms.begin()&&*it>md[i].y)return false;
if(*it>md[i].y) it--;
if(*it>=md[i].x){
ms.erase(it);
}else return false;
}
return true;
}
int main(){
read(n),read(m);
for(int i=1;i<=n;i++){
read(a[i].x),read(a[i].y);
}
for(int i=2;i<=n;i++){
md[i].x = a[i].x-a[i-1].y;
md[i].y = a[i].y-a[i-1].x;
}
sort(md+2,md+n+1,cmp);
for(int i=1;i<=m;i++){
scanf("%I64d",&x);
ms.insert(x);
}
if(solve()) printf("YES\n");
else printf("NO\n");
return 0;
}