连接小岛

来源:互联网 发布:网络桥架 编辑:程序博客网 时间:2024/04/28 18:59

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 longusing 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;}