C. Wilbur and Points---cf596C

http://codeforces.com/problemset/problem/596/C

题目大意:  给你n个数对  确保如果(x,y)存在这个集合  那么  0<=x'<=x && 0<=y'<=y (x',y')也一定存在这个集合    他们规定 i的美观值=(y-x)   还会给你一个美观值序列   每一个如果都有唯一一个i与之匹配   并且 这个集合后面的所有数都不能小于前面的数  也就是说(

a[s[i]].x<=a[s[i-1]].x && a[s[i]].y<=a[s[i-1]].y

分析:   我觉得应该先对a数组从小到大排序  这样避免以后在比较的时候出现错误

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
#include<queue>
#include<algorithm>
#include<iostream>

using namespace std;
#define N 500050
const double ESP = 1e-8;
#define INF 0x3f3f3f3f
#define memset(a,b) memset(a,b,sizeof(a))

int s[N];

struct node
{
    int x,y;
}a[N];
struct Node
{
    int v,k;
}b[N],c[N];

int cmp(Node p,Node q)
{
    if(p.v!=q.v)
        return p.v<q.v;
    else
        return p.k<q.k;
}

int cmp1(node p,node q)
{
    if(p.x!=q.x)
        return p.x<q.x;
    else
        return p.y<q.y;
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(s,0);
        memset(a,0);
        memset(b,0);
        memset(c,0);
        for(int i=0;i<n;i++)
        {
            scanf("%d %d",&a[i].x,&a[i].y);
        }
        sort(a,a+n,cmp1);
        for(int i=0;i<n;i++)
        {
            c[i].v=a[i].y-a[i].x;
            c[i].k=i;
        }
        for(int i=0;i<n;i++)
        {
            scanf("%d",&b[i].v);
            b[i].k=i;
        }
        sort(b,b+n,cmp);
        sort(c,c+n,cmp);
        int flag=0;
        for(int i=0;i<n;i++)
        {
            if(b[i].v!=c[i].v)
            {
                flag=1;
                break;
            }
            else
            {
                s[b[i].k]=c[i].k;
            }
        }
        for(int i=1;i<n;i++)
        {
            if(a[s[i]].x<=a[s[i-1]].x && a[s[i]].y<=a[s[i-1]].y)
                flag=1;
            if(flag==1)
                break;
        }
        if(flag==1)
            printf("NO
");
        else
        {
            printf("YES
");
            for(int i=0;i<n;i++)
            {
                printf("%d %d
",a[s[i]].x,a[s[i]].y);
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/linliu/p/5442448.html