E. Correct Placement

题目链接:Problem - E - Codeforces

题目大意:有n个高为hi,宽为wi的(1<= i <= n)的矩形,判断是否矩形 i 可以包含 矩形 j。即满足:

  • hj < hi 且 wj < wi
  • wj < hi hj < wi

满足以上之一即可,然后将下标 j 写在 下标 i 上的对应数组。

数据范围:

第一行包含一个整数 t ( 1 ≤ t ≤ 1e4 )--测试用例数。

每个测试用例的第一行包含一个整数 n ( 1 ≤ n ≤ 2⋅1e5 ) -数量。

随后是 n 行,两个整数 hi 和 wi 描述。( 1≤hi, wi ≤ 1e9 )--分别是 i 的高度和宽度。

保证所有测试用例的 n 之和不超过 2⋅1e5 。

考察:双指针, 排序, 贪心

解题思路:首先,根据满足的条件可以看出,矩形可以横着放,竖着放。所以每一个矩形可以维护,最大值为高。然后通过高进行排序, 核心:贪心的想法, 最小的矩形最有可能满足,后面的大矩形匹配, 所以采用双指针技巧,维护一个最小的矩形即可。在高度满足的情况下,即通过比较矩形的宽度,维护最小矩形。 注意:代码中 pos1 指向的是p数组的下标, pos是输入时的下标。

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

using i64 = long long;
using i128 = __int128;

void solve(){
    int n;
    cin >> n;
    vector<int> a(n+1), b(n+1);
    vector<array<int, 3>> p;
    for(int i=1; i<=n; i++) {
        cin >> a[i] >> b[i];
        if(a[i]<b[i]){
            swap(a[i],b[i]);
        }
        p.push_back({a[i],b[i],i});
    }    
    //排序
    sort(p.begin(), p.end(),[&](auto&x, auto&y){
        if(x[0] < y[0] || x[0] > y[0]){
            return x[0] < y[0];
        }else if(x[0]==y[0]) {
            return x[1] < y[1];
        }
    });
    vector<int> ans(n+1,-1);
    
    int i=0,j=0;
    int pos = -1;//p数组的下标
    int pos1 = -1;//原输入的下标
    while(i<n) {
        while(pos==-1 || (j<n && p[i][0] > p[j][0])) {
            if(pos==-1 || p[pos][1] > p[j][1]) {//维护最小的矩形
                pos1 = p[j][2];
                pos = j;
            }
            j++;
        }
        //判断是否可以更新
        if(pos==-1 || (a[p[i][2]] > a[pos1] && b[p[i][2]] > b[pos1])) {
            ans[p[i][2]] = pos1;
        }
        i++;
    }
    for(int i=1; i<=n; i++) {
        cout << ans[i] << " ";
    }
    cout << "\n";
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int t = 1;
    cin >> t;
    while(t--) {
        solve();
    }
}

感谢收看与点赞, 欢迎大佬指正。

相关推荐
大熊背9 小时前
如何利用Lv值实现三级降帧
算法·自动曝光·lv·isppipeline
大尚来也9 小时前
驾驭并发:.NET多线程编程的挑战与破局之道
java·前端·算法
向阳而生,一路生花10 小时前
深入浅出 JDK7 HashMap 源码分析
算法·哈希算法
君义_noip10 小时前
信息学奥赛一本通 4150:【GESP2509七级】⾦币收集 | 洛谷 P14078 [GESP202509 七级] 金币收集
c++·算法·gesp·信息学奥赛·csp-s
摸个小yu10 小时前
【力扣LeetCode热题h100】链表、二叉树
算法·leetcode·链表
汀、人工智能10 小时前
[特殊字符] 第93课:太平洋大西洋水流问题
数据结构·算法·数据库架构·图论·bfs·太平洋大西洋水流问题
ZPC821010 小时前
rviz2 仿真控制器与真实机器人切换
人工智能·算法·机器人
澈20710 小时前
双指针,数组去重
c++·算法
小辉同志11 小时前
207. 课程表
c++·算法·力扣·图论
CheerWWW11 小时前
深入理解计算机系统——位运算、树状数组
笔记·学习·算法·计算机系统