蓝桥备战:四元组问题(蓝桥OJ 3416)

简介: 蓝桥备战:四元组问题(蓝桥OJ 3416)

这道题不咋好想出来(哎哎哎~~~~~~~感觉这次省赛寄了)

题目:

暴力:

最直观的做法,四层循环遍历所有子序列,看是否又满足条件的,看数据前百分之50数据范围是200,四层循环下来是2e8,运气好的话应该前百分之50是能过掉的。

百分百数据是1e5级别的,做法差不多就是O(n)或者O(nlogn),O(nlogn)做法是线段树,这里讲解

O(n)的做法。

优化:

我们先来看同样的三元组问题,即我们先只看前三个数,a <  b < c且nums[c] < nums[a] < nums[b]

只要我们找到了符合这种情况的三元组,那么只要再有一个数d > c且nums[d] < nums[c]即可,也就是说只要在c后面存在一个最小的数小于c那么就能凑成四元组对吧,所以我们可以维护一个后缀和,维护的属性是区间最小值,只要c后面的区间存在一个最小值小于c这个值,那么即存在四元组。

后缀和代码:

for(int i = n - 1;i >= 1;--i)
    min_r[i] = min(min_r[i+1],a[i]);

有了后缀和之后我们就可以实现O(1)查询了。

现在我们已经解决了d的问题,我们再来解决a b c 这个三元组的问题

a b c他们三个的大概形状是这样:

由图可知a在符合条件的前提下越大肯定是越好的,而在此基础上b是什么值无所谓只要比a大就可以了。所以我们创建一个临时变量k存储遍历过程中的符合条件的最大值。(条件便是要有一个数大于a,即拥有一个b)

所以我们从前往往后遍历,把每个数进栈,一旦出现一个数大于栈顶,那么此时b就存在了,我们把栈里所有小于b的的数出栈吧并记录所有出栈里的数最大的那个数k,k = max(k, stack.pop())。(这里提一嘴这个栈是单调递减的)此后在b存在的基础上一旦出现一个数小于k,那么边出现c了,我们在看c后面是否存在一个数小于c即可。

模拟:

数组:1000 333  222 888  999  100 50

第一次1000进栈,接着333进栈,222进栈之后888 > 222进行出栈,222 333相继出栈,888自己进栈,此时b = 888, k = 333(也就是a后面将不做解释)。之后999 > 888代表我们可以更新a使之更大,此时k = 888, b = 999,栈顶可以看作b,接着100进栈,此时a b皆有,c就可以有了,100 < k那么c = 100,之后找在c后面是否存在一个数小于c,明显是50。那么序列已经找到为888 999 100 50。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
int a[N];
int main(){
    int n;
    cin>>n;  
    for(int i = 0;i < n ; i++)   cin>>a[i];
    stack<int> st;
    int k = INT_MIN,INF = INT_MAX;
    //min_r[i]表示i右边最小的数
    vector<int> min_r(n,INF);
    for(int i = n - 1;i >= 1;--i)
        min_r[i] = min(min_r[i+1],a[i]);
    for(int i = 0;i < n;i++)
    {
        if(a[i] < k && a[i] > min_r[i])
        {
            cout << "YES";
            return 0;
        }
        while(!st.empty() && st.top() < a[i])
        {
            k = max(k,st.top());
            st.pop();
        }
        st.push(a[i]);
    }
    cout<< "NO";
    return 0; 
}
目录
相关文章
|
机器学习/深度学习 算法 数据挖掘
即插即用 | 通过自适应聚类Transformer来提升DERT目标检测器的速度(文末附论文下载)(一)
即插即用 | 通过自适应聚类Transformer来提升DERT目标检测器的速度(文末附论文下载)(一)
1613 0
|
SQL 存储 关系型数据库
如何巧用索引优化SQL语句性能?
本文从索引角度探讨了如何优化MySQL中的SQL语句性能。首先介绍了如何通过查看执行时间和执行计划定位慢SQL,并详细解析了EXPLAIN命令的各个字段含义。接着讲解了索引优化的关键点,包括聚簇索引、索引覆盖、联合索引及最左前缀原则等。最后,通过具体示例展示了索引如何提升查询速度,并提供了三层B+树的存储容量计算方法。通过这些技巧,可以帮助开发者有效提升数据库查询效率。
1358 2
|
8月前
|
人工智能 自然语言处理 安全
⚡阿里云百炼通义音色设计 Voice Design 使用指南🎨
通义千问 qwen-voice-design 模型支持通过文字描述快速生成定制化音色,结合 qwen3-tts-vd-realtime 可输出11种语言语音,适用于广告配音、角色塑造、有声内容创作及多语言出海等场景,提供高效、灵活的语音设计解决方案。
1938 9
|
8月前
|
人工智能 JavaScript Java
阿里云百炼API调用教程:准备API-Key、配置环境变量和调用API流程
本文介绍阿里云百炼API调用全流程:注册登录阿里云账号,开通百炼服务,创建并配置API Key至环境变量,避免硬编码风险。支持通过Python的OpenAI兼容接口或DashScope SDK调用大模型,亦可在Node.js、Java等环境中使用。附详细命令与代码示例,助您快速上手百炼AI大模型平台。
5006 1
|
Ubuntu Shell Linux
pyenv 管理多个 Python 版本(1)
pyenv 管理多个 Python 版本(1)
701 86
pyenv 管理多个 Python 版本(1)
|
机器学习/深度学习 人工智能 安全
AI的万亿商机:红杉资本眼中的人工智能新时代
AI不仅仅是不可避免的趋势,而是已经到来的现实,其市场规模将远超过去的任何一次技术变革。这不是一场可以观望的比赛,而是一场必须全力以赴参与的革命。
605 22
|
运维 监控 Java
系统日志规范及最佳实践
系统日志规范及最佳实践
1434 1
系统日志规范及最佳实践
|
Java Nacos 数据安全/隐私保护
Nacos - 安装指南(Windows系统)
最简单快捷的在Windos中下载Nacos的方法
2947 1
Nacos - 安装指南(Windows系统)
|
机器学习/深度学习 人工智能 算法
【CVPR2024】面向StableDiffusion的编辑算法FreePromptEditing,提升图像编辑效果
近日,阿里云人工智能平台PAI与华南理工大学贾奎教授团队合作在深度学习顶级会议 CVPR2024 上发表 FPE(Free-Prompt-Editing) 算法,这是一种面向StableDiffusion的图像编辑算法。在这篇论文中,StableDiffusion可用于实现图像编辑的本质被挖掘,解释证明了基于StableDiffusion编辑的算法本质,并基于此设计了新的图像编辑算法,大幅度提升了图像编辑的效率。

热门文章

最新文章