原题链接: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;
}