关闭

Codeforces Round #331 (Div. 2) C. Wilbur and Points

225人阅读 评论(0) 收藏 举报
分类:

题目链接

题意:

输入n,然后给出n组 (x, y);

给出n 个w[i];

要求:将n组(x, y)排序,要求x[i] <= x[i + 1] || y[i] <= y[i + 1]

并且w[i] = y[i] - x[i]

若存在,输出YES以及排序结果

否则,输出NO


思路:

首先判断是否存在一个最佳的序列b[]使得:b[i] = y[i] - x[i] = w[j]

再判断序列b[]是否为关于二维点集的一个美观序列。

代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
int n; 
struct node
{
	int x, y, v, id, rt;
};
node p1[N], p2[N];

bool cmp1(node a, node b)
{
	if(a.v != b.v) return a.v < b.v;
	else
	{
		if(a.x != b.x) return a.x < b.x;
		else return a.y < b.y;
	}
}

bool cmp2(node a, node b)
{
	if(a.v != b.v) return a.v < b.v;
	else return a.id < b.id;
}

bool cmp3(node a, node b)
{
	return a.id < b.id;
}

int main()
{
	while(~scanf("%d", &n))
	{ 
		for(int i = 0; i < n; i++)
		{
			scanf("%d%d", &p1[i].x, &p1[i].y);
			p1[i].v = p1[i].y - p1[i].x;
			p1[i].id = i;
		}
		sort(p1, p1 + n, cmp1);
		for(int i = 0; i < n; i++)
		{
			scanf("%d", &p2[i].v);
			p2[i].id = i;
		}
		sort(p2, p2 + n, cmp2);
		bool flag = false;
		for(int i = 0; i < n; i++)
		{
			if(p1[i].v != p2[i].v)
			{
				flag = 1; break;
			}
			else p2[i].rt = p1[i].id;
		}
		if(flag)
		{
			puts("NO"); continue;
		}
		else
		{
			sort(p1, p1 + n, cmp3);
			sort(p2, p2 + n, cmp3);
			for(int i = 1; i < n; i++)
			{
				if(!(p1[p2[i].rt].x > p1[p2[i - 1].rt].x || p1[p2[i].rt].y > p1[p2[i - 1].rt].y))
				{
					flag = 1; break;
				}
			}
			if(flag)
			{
				puts("NO"); continue;
			}
			else
			{
				puts("YES");
				for(int i = 0; i < n; i++)
				{
					printf("%d %d\n", p1[p2[i].rt].x, p1[p2[i].rt].y);
				}
			}
		}
	}
	return 0;
} 


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:38108次
    • 积分:1372
    • 等级:
    • 排名:千里之外
    • 原创:103篇
    • 转载:1篇
    • 译文:0篇
    • 评论:5条
    最新评论