列表

详情


ZJ13. 最大点集

描述

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

 

如下图:实心点为满足条件的点的集合。

请实现代码找到集合P中的所有”最大“点的集合并输出。

输入描述

第一行输入点集的个数N, 接下来N行,每行两个数字代表点的X轴和Y轴。1 ≤ n ≤ 500000

输出描述

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

示例1

输入:

5
1 2
5 3
4 6
7 5
9 0

输出:

4 6
7 5
9 0

原站题解

C++ 解法, 执行用时: 81ms, 内存消耗: 3960KB, 提交时间: 2022-04-26

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<queue>
using namespace std;

struct point
{
	int x,y;
	bool operator<(const point&a) const
	{
		return y>a.y;
	}
};

int n;
point a[500005];

int read()
{
	int ret=0,base=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') base=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		ret=ret*10+ch-'0';
		ch=getchar();
	}
	return ret*base;
}

inline void print(point x)
{
	printf("%d %d\n",x.x,x.y);
}

int main()
{
	n=read();
	for(int i=1;i<=n;i++)
	{
		a[i].x=read();
		a[i].y=read();
	}
	sort(a+1,a+1+n);
	print(a[1]);
	for(int i=2,last=a[1].x;i<=n;i++)
	{
		if(a[i].x>=last)
		{
			print(a[i]);
			last=a[i].x;
		}
	}
	return 0;
}

C++ 解法, 执行用时: 104ms, 内存消耗: 3960KB, 提交时间: 2020-07-06

#include <cstdio>
#include <iostream>
#include <algorithm>
#define maxn 1000007
using namespace std;
int n;
struct pt {
    int x, y;
} a[maxn];

bool cmp(pt A, pt B) {
    return A.x > B.x;
}

int ansx[maxn], ansy[maxn];
int ans_tot = 0;
int main () {
    scanf("%d", &n);
    for (int i=0; i<n; i++) {
        scanf("%d%d", &a[i].x, &a[i].y);
    }
    sort(a, a + n, cmp);
    int max_height = -1;
    for (int i=0; i<n; i++) {
        if (a[i].y > max_height) {
            max_height = a[i].y;
            
            ansx[ans_tot] = a[i].x;
            ansy[ans_tot] = a[i].y;
            ans_tot++;
        }
    }
    for (int i=ans_tot - 1; i>=0; i--) {
        printf("%d %d\n", ansx[i], ansy[i]);
    }
    return 0;
}

C++ 解法, 执行用时: 114ms, 内存消耗: 4044KB, 提交时间: 2021-08-04

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

struct Node {
    int x, y;
    bool operator<(const Node &node) const {
        return y>node.y;
    }
};

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n;
    cin >> n;
    vector<Node> v(n);
    for(int i=0;i<n;i++)
        cin >> v[i].x >> v[i].y;
    sort(v.begin(), v.end());
    int minx=0, ret=0;
    for (int i=0;i<n;i++) {
        if (v[i].x>minx) {
            ret++;
            minx = v[i].x;
            cout << v[i].x << " " << v[i].y << endl;
        }
    }
}

C++ 解法, 执行用时: 115ms, 内存消耗: 4080KB, 提交时间: 2021-10-07

#include <bits/stdc++.h>
using namespace std;

struct P{
    int x, y;
    bool operator < ( P &p) {
        return y > p.y;
    }
};

int main(){
    int n, x, y, Max=0;
    scanf("%d", &n);
    P p[n];
    for(int i=0;i<n;i++)
        scanf("%d%d", &p[i].x, &p[i].y);
    sort(p, p+n);
    for(int i=0;i<n;i++){
        if(p[i].x > Max){
            Max = p[i].x;
            printf("%d %d\n", p[i].x, p[i].y);
        }
    }
    return 0;
}

C++ 解法, 执行用时: 117ms, 内存消耗: 4128KB, 提交时间: 2021-02-19

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
#define pii pair<int, int>
#define pll pair<ll, ll>
#define mp make_pair
#define faster_cin_cout ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(0)

#define maxn 500001
pii points[maxn];

template <typename T>
inline void read(T &x) {char ch=getchar(); int f=1; x=0; while(!isdigit(ch)){if(ch=='-')f *= -1; ch=getchar();} while(isdigit(ch)) {x = (x<<1) + (x<<3) + (ch^48); ch=getchar();} x*=f;}
ll qpow(ll x, ll y) { ll a=1, b=x; while(y){if(y&0x1) a*=b; b*=b; y>>=1;} return a;}

int main(void)
{
#ifndef ONLINE_JUDGE
    ifstream cin("in.txt");
#endif
    //faster_cin_cout;

    int n, xpos = -1;
    read(n);
    for(int i = 1; i <= n; i++) read(points[i].first), read(points[i].second);
    sort(points+1, points+n+1, [](const pii& l, const pii& r){return l.second>r.second;});
    for(int i = 1; i <= n; i++) {
        if(points[i].first > xpos) {
            xpos = points[i].first;
            printf("%d %d\n", points[i].first, points[i].second);
        }
    }
    return 0;
}

上一题