題目描述
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
輸出
複制
#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;
}