矩形玻璃罩

GitHub跳转原题关系图返回列表

x、y 两个方向独立取最小外接矩形,边界不算罩内且角点必须为整数,恰好把每条边强制外扩 1 格。

OJ: roj

题目 ID: 20016

难度:入门

标签:几何思维

创建: 2026-08-28 22:10

更新: 2026-10-07 13:50

题目描述

给定平面上的 nn 个点,求四边与坐标轴平行的矩形,要求所有点严格落在矩形内部(边界上的点不算),且左上角与右下角坐标都是整数,使面积最小,输出该矩形左上角与右下角的坐标。

输入:第一行整数 nn,接下来 nn 行每行两个整数 x,yx,y。输出:两行,分别是左上角坐标与右下角坐标。数据范围 2⩽n⩽2×1052 \leqslant n \leqslant 2\times10^5,1⩽x,y⩽1081 \leqslant x,y \leqslant 10^8。

样例 1 输入 2 / 3 4 / 5 6,输出 2 3 / 6 7;样例 2 输入 5 / 44 62 / 34 69 / 24 78 / 42 44 / 64 10,输出 23 9 / 65 79。

思路

x、y 两方向独立取极值:左边界必须小于最小 x、右边界必须大于最大 x,整数约束下最紧只能取 minx-1、maxx+1,y 方向同理,故答案为 (minx-1, miny-1) 到 (maxx+1, maxy+1)。一遍扫描维护四个极值即可,时间复杂度 O(n)。

参考代码

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-08-28 21:26
 * update_at: 2026-08-28 21:26
 */
// A. Glass:最小外接矩形 + 边界外扩 1。
// 罩子边界上的点不算在罩内,且左上/右下坐标必须是整数:
// 左边界 = minx-1、右边界 = maxx+1,y 方向同理,一遍扫描求四个极值即可。
#include <bits/stdc++.h>
using namespace std;

const int INF = 1e9;

int n;
long long minx, miny, maxx, maxy; // x、y 方向的最小/最大值

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;
    minx = miny = INF;
    maxx = maxy = -INF;
    for (int i = 1; i <= n; i++) {
        long long x, y;
        cin >> x >> y;
        // 同时维护 x、y 两个方向的极值,一次扫描完成
        minx = min(minx, x);
        maxx = max(maxx, x);
        miny = min(miny, y);
        maxy = max(maxy, y);
    }
    // 左上角 = (minx-1, miny-1),右下角 = (maxx+1, maxy+1)
    // 注意官方数据最后一行没有换行,这里第二行也不输出换行
    cout << minx - 1 << ' ' << miny - 1 << '\n';
    cout << maxx + 1 << ' ' << maxy + 1;
    return 0;
}