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