MT3024 max=min

简介: MT3024 max=min

61a508aa527546f593516916218e24e3.jpg

样例 1

输入:

6

1 2 3 2 1 4

6 7 1 2 3 2

输出:

2

备注

1≤n≤10^6,1≤ai,bi≤10^9。

思路:

(1)使用ST表。

ST表(Sparse Table)是一种用于高效处理区间查询的数据结构。它可以在O(1)的时间复杂度内回答某一区间的最值查询(最小值、最大值等)。ST表使用动态规划的思想,通过预处理的方式来快速计算出各个区间的最值。

(2)使用二分。因为此题具有单调性:随着放入数组的数越多,最大值一定非递减。最小值一定非递增。如果固定右端点r,则向左看,最大值从l->r呈阶梯状递增,最小值从l->r呈阶梯状递减,其中一定有交点使最小值=最大值。因为是阶梯状递增和递减,所以交点为横着的一条线段,即l的范围为此线段的范围。

所以每次枚举r,找l的范围并保存在答案中。找l的范围即找max=min,用二分来找。

此题代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n, a[N], b[N], mn[N][20], mx[N][20], Lg[N], l, r, mid, ans;
void pre()
{
    Lg[1] = 0;
    for (int i = 2; i <= n; i++)
    {
        Lg[i] = Lg[i >> 1] + 1;
    }
}
void ST_create()
{ // 创建ST表
    for (int i = 1; i <= n; i++)
    {
        mx[i][0] = a[i], mn[i][0] = b[i];
    }
    for (int j = 1; j <= Lg[n]; j++)
    {
        for (int i = 1; i <= n - (1 << j) + 1; i++)
        {
            mx[i][j] = max(mx[i][j - 1], mx[i + (1 << (j - 1))][j - 1]);
            mn[i][j] = min(mn[i][j - 1], mn[i + (1 << (j - 1))][j - 1]);
        }
    }
}
int ST_qmax(int l, int r)
{ // ST表求max
    int k = Lg[r - l + 1];
    return max(mx[l][k], mx[r - (1 << k) + 1][k]);
}
int ST_qmin(int l, int r)
{ // ST表求min
    int k = Lg[r - l + 1];
    return min(mn[l][k], mn[r - (1 << k) + 1][k]);
}
 
int findl(int i)
{ // l的范围左边界
    int l = 1, r = i, mid, ans = 0, minn, maxn;
    while (l <= r)
    {
        mid = (l + r) / 2;
        maxn = ST_qmax(mid, i), minn = ST_qmin(mid, i);
        if (maxn <= minn)
        {
            ans = mid, r = mid - 1;
        }
        else
            l = mid + 1;
    }
    return ans;
}
int findr(int i) // i为固定的枚举的右边界
{                // l的范围右边界
    int l = 1, r = i, mid, ans = 0, minn, maxn;
    while (l <= r) // 二分
    {
        mid = (l + r) / 2;
        maxn = ST_qmax(mid, i), minn = ST_qmin(mid, i);
        if (maxn >= minn)
        {
            ans = mid, l = mid + 1;
        }
        else
            r = mid - 1;
    }
    return ans;
}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i <= n; i++)
        cin >> b[i];
    pre();
    ST_create();
    for (int i = 1; i <= n; i++)
    { // 枚举右端点i
        // 对于每个i,求l的范围findl和findr
        int j = findl(i);
        if (j < 1 || j > i)
        {
            continue;
        }
        int k = findr(i);
        ans += k - j + 1;
    }
    cout << ans;
    return 0;
}


相关文章
|
人工智能 搜索推荐 算法
玩转通义星尘:体验定制化多样角色能力
在杭州云栖大会上,阿里云对外展示了一款个性化角色创作平台——**通义星尘**,其基于大规模高质量个性化对话数据,采用分阶段的个性化训练策略,使得模型在保持通用能力的基础上,延伸出拟人、具有情感、鲜明语言风格的能力,在角色的个性、风格遵循上具有更强的指令遵循能力。那么其能力展现到底如何?我们又能玩出哪些花样呢?今天开始测试通义星尘,争取年前把8个垂直模型都测试一遍,,加油!本文为原创,未经许可请勿搬运。
玩转通义星尘:体验定制化多样角色能力
|
Dubbo Java 应用服务中间件
微服务框架(十四)Spring Boot @ControllerAdvice异常处理
此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。   本文为Spring Boot使用@ControllerAdvice进行自定义异常捕捉
|
算法 Shell Linux
【Shell 命令集合 文档编辑】Linux 删除指定列的内容 colrm 命令使用教程
【Shell 命令集合 文档编辑】Linux 删除指定列的内容 colrm 命令使用教程
198 0
|
9月前
基于springboot+thymeleaf+Redis仿知乎网站问答项目源码
基于springboot+thymeleaf+Redis仿知乎网站问答项目源码
278 36
|
机器学习/深度学习 算法 数据可视化
决策树算法介绍:原理与案例实现
决策树算法介绍:原理与案例实现
The requested URL could not be retrieved
The requested URL could not be retrieved
279 1
|
Java
Java面试题之cpu占用率100%,进行定位和解决
这篇文章介绍了如何定位和解决Java服务中CPU占用率过高的问题,包括使用top命令找到高CPU占用的进程和线程,以及使用jstack工具获取堆栈信息来确定问题代码位置的步骤。
810 0
Java面试题之cpu占用率100%,进行定位和解决
|
新零售 运维 前端开发
理解中台
理解中台
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
678 3
|
Web App开发 开发者 iOS开发
iOS开发者帐号申请指南(转)
iOS开发者帐号申请指南(转)
345 1