Yedl的专栏

Stay hungry, stay foolish

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

题目链接

题意:

输入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;
} 


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Doris1104/article/details/49914733
个人分类: CodeForces
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭