题目描述

P为给定的二维平面整数点集。定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内)

如下图:实心点为满足条件的点的集合。请实现代码找到集合 P 中的所有 ”最大“ 点的集合并输出。

图坐标数据结构(结构体)的设计以及栈的应用_点集

 

输入描述:


第一行输入点集的个数 N, 接下来 N 行,每行两个数字代表点的 X 轴和 Y 轴。 对于 50%的数据, 1 <= N <= 10000; 对于 100%的数据, 1 <= N <= 500000;


输出描述:


输出“最大的” 点集合, 按照 X 轴从小到大的方式输出,每行两个数字分别代表点的 X 轴和 Y轴。


示例1

输入

复制


5 1 2 5 3 4 6 7 5 9 0


输出

复制


4 6 7 5 9 0


#include<stack>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;

struct Node{
int x,y;
Node(){}
Node(int x,int y){
this->x = x;
this->y = y;
}
};

bool Cmp(const Node& A,const Node& B){
return A.x < B.x;
}

int main(){
int N;
vector<Node> Vec;
stack<Node> S;
cin >> N;
for(int i = 0;i < N;i ++){
int tmpx,tmpy;
cin >> tmpx >> tmpy;
Node tmp = Node(tmpx,tmpy);
Vec.push_back(tmp);
}
sort(Vec.begin(),Vec.end(),Cmp);
for(int i = 0;i < N;i ++){
if(S.empty() || S.top().y > Vec[i].y){
S.push(Vec[i]);
}
else{
while(!S.empty() && S.top().y <= Vec[i].y){
S.pop();
}
S.push(Vec[i]);
}
}
vector<Node> Res;
while(!S.empty()){
Res.push_back(S.top());
S.pop();
}
for(int i = Res.size() - 1;i >= 0;i --){
printf("%d %d\n",Res[i].x,Res[i].y);
}
return 0;
}