天天看點

圖坐标資料結構(結構體)的設計以及棧的應用

題目描述

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;
}