蓝桥备战-区间嵌套--前缀和做法

简介: 蓝桥备战-区间嵌套--前缀和做法

题目:

思路:

区间按照左端点排序,如果左端点相等,则按照右端点逆序排序(右端点越大越好),从前往后一次枚举每个区间,如果一个区间后面存在一个区间的右端点小于等于我这个区间的右端点那么即存在。所以我们只需要看后面是否存在一个最小的右端点是否小于等于该区间的右端点即可。

创建一个后缀和维护区间右端点最小值。

代码:

#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
const int N = 3e5 +10;
int n;
struct Range
{
    int x, y, id;
    bool operator < (const Range &r)
    {
        if (x != r.x)   return x < r.x;
        else return r.y < y;
    }
}range[N];
Range b[N];
int main()
{
    cin >> n;
    for (int i = 0; i < N; i++)
        b[i].y = 0x3f3f3f3f;
    for (int i = 0; i < n; i++)
    {
        int a, b;
        cin >> a >> b;
        range[i] = {a, b, i};
    }
    sort (range, range + n);
    for (int i = n - 1; i >= 0; i--)
    {
        b[i] = b[i + 1];
        if (b[i].y >= range[i].y)
            b[i] = range[i];
    }
    for (int i = 0; i < n; i++)
    {
        if (range[i].y >= b[i + 1].y)
        {
            cout << b[i + 1].id + 1 << " ";
            cout << range[i].id + 1;
            return 0;
        }
    }
    cout << "-1 -1";
    return 0;
}

另一种比较巧妙的思路:

我们只需要枚举相邻区间即可,因为如果枚举相邻区间的时候没有出现右端点逆序的(可等于),便代表所有区间的右端点是升序的(不包含等于)。那么及不存在嵌套区间。所以想要出现嵌套区间相邻区间必然存在右端点逆序。

代码:

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 3e5 +10;
int n;
struct Range
{
    int x, y, id;
    bool operator < (const Range &r)
    {
        if (x != r.x)   return x < r.x;
        else return r.y < y;
    }
}range[N];
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        int a, b;
        cin >> a >> b;
        range[i] = {a, b, i};
    }
    sort (range, range + n);
    for (int i = 0; i < n - 1; i++)
    {
        if (range[i].y >= range[i + 1].y)
        {
            cout << range[i + 1].id + 1 << " ";
            cout << range[i].id + 1;
            return 0;
        }
    }
    cout << "-1 -1";
    return 0;
}


目录
相关文章
|
10月前
|
运维 Kubernetes Cloud Native
深入理解云原生架构:从理论到实践
【10月更文挑战第38天】本文将引导读者深入探索云原生技术的核心概念,以及如何将这些概念应用于实际的软件开发和运维中。我们将从云原生的基本定义出发,逐步展开其背后的设计哲学、关键技术组件,并以一个具体的代码示例来演示云原生应用的构建过程。无论你是云原生技术的初学者,还是希望深化理解的开发者,这篇文章都将为你提供有价值的见解和实操指南。
|
12月前
|
存储 运维 监控
实时计算Flink版最佳实践测评
实时计算Flink版最佳实践测评
242 1
|
XML API Android开发
Android 自定义View 之 Dialog弹窗
Android 自定义View 之 Dialog弹窗
423 1
|
存储 canal 消息中间件
数据仓库系列(三)数仓分层的意义价值及如何设计数据分层
数据仓库系列(三)数仓分层的意义价值及如何设计数据分层
1753 0
数据仓库系列(三)数仓分层的意义价值及如何设计数据分层
Linux 命令 `chown`:改变文件或目录的所有者
`chown` 是 Linux 中用于改变文件或目录所有者的命令。基本语法是 `chown [选项] 新所有者 文件或目录...`。常用选项包括 `-R` 递归更改、`-c` 显示详细信息和 `-v` 显示详细处理。示例:将 `example.txt` 所有者改为 `user2` 使用 `chown user2 example.txt`;更改目录 `mydir` 及其内容所有者为 `user2` 使用 `chown -R user2 mydir`。注意,通常只有 root 或当前所有者能更改所有者,且需谨慎操作以避免影响权限。
|
存储 弹性计算 运维
如何正确选择多云架构?
多云是指企业使用两个或更多的公有云 IaaS 供应商。广义来看,混合云也在其范畴。
1025 1
如何正确选择多云架构?
|
机器学习/深度学习 边缘计算 分布式计算
云计算应用方向研究
云计算应用方向研究
475 0
|
应用服务中间件 Shell nginx
win10 nginx设置开机启动 --亲测有效
win10 nginx设置开机启动 --亲测有效
268 0
|
开发框架 Java .NET
SpringBoot3中的属性绑定注解和YMAL配置文件、日志
SpringBoot3中的属性绑定注解和YMAL配置文件、日志
|
Linux API
pthread_mutex_init & 互斥锁pthread_mutex_t的使用
pthread_mutex_init l         头文件: #include l         函数原型: int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr); pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; l         函数作用: 该函数用于C函数的多线程编程中,互斥锁的初始化。
2101 0