原题链接:https://vjudge.net/problem/UVA-11134
分类:贪心法
备注:问题分解
可以看出两个维度上的问题是独立的,因此把二维问题化成一维问题
贪心思想看:https://www.cnblogs.com/pfypfy/p/9062584.html
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e3+5;
int n,xl[maxn],vis[2][maxn],ans[2][maxn];
struct node{int l,r,id;bool operator < (const node& a){return r<a.r||(r==a.r&l<a.l)||(l==a.l&&r==a.r&&id<a.id);}
}x[maxn],y[maxn];
int main(void){//freopen("in.txt","r",stdin);while(~scanf("%d",&n)&&n){for(int i=1;i<=n;i++){scanf("%d %d %d %d",&x[i].l,&y[i].l,&x[i].r,&y[i].r);x[i].id=y[i].id=i;}memset(vis,0,sizeof(vis));sort(x+1,x+1+n);sort(y+1,y+1+n);int flg=0;for(int i=1;i<=n;i++){int posX=x[i].l; while(vis[0][posX])posX++;if(posX>x[i].r){flg=1; break;}vis[0][posX]=1; ans[0][x[i].id]=posX; int posY=y[i].l; while(vis[1][posY])posY++;if(posY>y[i].r){flg=1; break;}vis[1][posY]=1; ans[1][y[i].id]=posY; }if(flg){printf("IMPOSSIBLE\n");continue;}for(int i=1;i<=n;i++)printf("%d %d\n",ans[0][i],ans[1][i]);}return 0;
}