www.pudn.com > SORT.rar > uva105.cpp


/* UVA 105 The Skyline Problem 
 * 4461339   2006-03-30 15:26:04  Accepted 0.043 Minimum robby @ TJU C++ 105 - The Skyline Problem  
 */ 
 
#include  
#include  
#include  
using namespace std; 
 
const int MAX = 5010; 
struct BB {int l,h,r;} b[MAX]; 
struct SS {int pos,h,flg;} s[MAX*2]; 
struct ANS {int pos,h;} ans[MAX*2]; 
multiset  si; 
 
int cmp(SS a,SS b) 
{ 
	if (a.pos != b.pos) return a.pos < b.pos; 
	else if (a.flg != b.flg) return a.flg < b.flg; 
	else return a.h < b.h; 
} 
 
int cmp2(ANS a,ANS b) 
{ 
	if (a.pos != b.pos) return a.pos < b.pos; 
	return a.h > b.h;	 
} 
 
int main() 
{ 
	int n = 0,i,ps,tmp,pans,first = 1; 
	while (scanf("%d%d%d",&b[n].l,&b[n].h,&b[n].r) != EOF) ++n; 
	for (i = ps = 0 ; i < n ; i++) { 
		s[ps].pos = b[i].l; s[ps].h = b[i].h; s[ps++].flg = 0; 
		s[ps].pos = b[i].r; s[ps].h = b[i].h; s[ps++].flg = 1; 
	} 
	sort(s,s+ps,cmp);  
	si.clear(); pans = 0; 
	for (i = 0 ; i < ps ; i++) { 
		if (s[i].flg == 0) { 
			if (si.size() == 0 || s[i].h > *(--si.end())) { 
				ans[pans].pos = s[i].pos; 
				ans[pans++].h = s[i].h; 
			} 
			si.insert(s[i].h); 
		} else { 
			si.erase(si.find(s[i].h)); 
			if (si.size() == 0) { 
				ans[pans].pos = s[i].pos; 
				ans[pans++].h = 0; 
			} 
			else { 
				tmp = *(--si.end()); 
				if (tmp < s[i].h) { 
					ans[pans].pos = s[i].pos; 
					ans[pans++].h = tmp; 
				} 
			} 
		}	 
	} 
	sort(ans,ans+pans,cmp2); 
	printf("%d %d",ans[0].pos,ans[0].h); 
	for (i = 1 ; i < pans ; i++) 
		if (i == 0 || ans[i].pos != ans[i-1].pos) 
			printf(" %d %d",ans[i].pos,ans[i].h); 
	printf("\n"); 
//	while (1); 
	return 0;	 
}