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

来源:互联网 发布:病假条淘宝暗语大全 编辑:程序博客网 时间:2024/05/18 01:54

题目链接

题意:

输入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
原创粉丝点击