蓝桥备战:四元组问题(蓝桥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; 
}
目录
相关文章
|
Shell 测试技术 Linux
通过shell脚本进行linux服务器的CPU和内存压测
通过shell脚本进行linux服务器的CPU和内存压测
571 0
|
2月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
131 6
|
消息中间件 安全 API
记项目的一次发送短信及短信模板配置分享
我们日常使用的软件或者网站,大部分都在使用短信业务,比如 注册 、 验证码功能 。还有一些特定的业务需要发送短信通知国内外用户等。有了需求就会有平台提供服务,国内有很多互联网公司都提供短信业务,比如阿里云、腾讯云、七牛。本次我们主要讲解的是阿里云提供的短信服务。
记项目的一次发送短信及短信模板配置分享
|
10月前
|
机器学习/深度学习 算法 计算机视觉
《深度学习案例实战》新书出版——基于阿里魔搭平台
《深度学习案例实战》是一本实用的指南,涵盖多个领域的深度学习应用案例。本书旨在通过具体的案例讲解,阐述典型深度学习算法在图像分类、声音识别、语义分割、目标检测等各个领域的广泛应用。本书所涵盖的典型案例包括太阳黑子分类、气象预测、食物声音分类、智能厨房、智能冰箱食材检测、集体照人脸识别、遛狗绳识别、智能售药机药品检测、道路裂纹检测、学生教室行为检测等。这些案例旨在通过实际问题的解决,使读者能够深入理解深度学习算法的应用和实践。 本书特别关注两个关键技术:低代码开发平台摩搭ModelScope和深度学习加速器OpenVINO。摩搭平台为读者提供了一个便捷的开发环境,借助其丰富的预训练模型库和开发平
359 2
《深度学习案例实战》新书出版——基于阿里魔搭平台
|
11月前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
517 60
|
11月前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第26天】本文详细探讨了Hadoop与Spark在大数据处理中的协同作用,通过具体案例展示了两者的最佳实践。Hadoop的HDFS和MapReduce负责数据存储和预处理,确保高可靠性和容错性;Spark则凭借其高性能和丰富的API,进行深度分析和机器学习,实现高效的批处理和实时处理。
412 1
|
10月前
|
前端开发 API 数据安全/隐私保护
探索RAG应用:文档智能与百炼平台的最佳实践(完整代码示例)
方华在阿里云开发者社区发现了一个构建RAG应用的活动,通过官方教程和阿里云提供的工具,如ROS、百炼平台及文档智能,实现了零代码配置RAG应用的Demo。本文分享了该项目的源码本地部署调试方法,介绍了其基于Python的Web应用程序结构,使用FastAPI和Jinja模板引擎,支持文件上传、自定义问答等功能。项目还详细描述了环境配置、服务启动等步骤,帮助开发者更好地理解和实践应用开发。
689 2
|
测试技术
蓝桥杯真题讲解——积木画
蓝桥杯真题讲解——积木画
217 0
|
11月前
|
人工智能 供应链 安全
AI辅助安全测试案例某电商-供应链平台平台安全漏洞
【11月更文挑战第13天】该案例介绍了一家电商供应链平台如何利用AI技术进行全面的安全测试,包括网络、应用和数据安全层面,发现了多个潜在漏洞,并采取了有效的修复措施,提升了平台的整体安全性。
475 4
|
SQL 安全 前端开发
软件测试指南:从策略到实践
【8月更文第21天】软件测试是为了评估软件的质量并验证其是否符合预期的功能要求而进行的一系列活动。本文将详细介绍软件测试的不同阶段、测试类型、测试策略与计划的制定、以及如何有效地管理与跟踪发现的缺陷。
867 1