蓝桥备战:四元组问题(蓝桥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和内存压测
801 0
|
缓存 网络协议 网络安全
计算机网络:应用层(上篇)
计算机网络:应用层(上篇)
385 2
|
JSON NoSQL Java
【Redis】2、Redis 的 Java 客户端(Jedis 和 SpringDataRedis)
【Redis】2、Redis 的 Java 客户端(Jedis 和 SpringDataRedis)
759 0
|
SQL 存储 关系型数据库
如何巧用索引优化SQL语句性能?
本文从索引角度探讨了如何优化MySQL中的SQL语句性能。首先介绍了如何通过查看执行时间和执行计划定位慢SQL,并详细解析了EXPLAIN命令的各个字段含义。接着讲解了索引优化的关键点,包括聚簇索引、索引覆盖、联合索引及最左前缀原则等。最后,通过具体示例展示了索引如何提升查询速度,并提供了三层B+树的存储容量计算方法。通过这些技巧,可以帮助开发者有效提升数据库查询效率。
1221 2
|
8月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
639 6
|
8月前
|
存储 NoSQL 算法
应对Redis中的并发冲突:有效解决策略
以上策略各有优劣:乐观锁和悲观锁控制得当时可以很好地解决并发问题;发布/订阅模式提高了实时响应能力;Lua脚本和Redis事务保证了命令序列的原子性;分布式锁适合跨节点的并发控制;限流措施和持久化配置从系统设计层面减少并发风险;数据分片通过架构上的优化减轻单个Redis节点的负担。正确选择适合自己应用场景的策略,是解决Redis并发冲突的关键。
397 0
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第26天】本文详细探讨了Hadoop与Spark在大数据处理中的协同作用,通过具体案例展示了两者的最佳实践。Hadoop的HDFS和MapReduce负责数据存储和预处理,确保高可靠性和容错性;Spark则凭借其高性能和丰富的API,进行深度分析和机器学习,实现高效的批处理和实时处理。
597 1
|
消息中间件 存储 算法
一文详解 RocketMQ 如何利用 Raft 进行高可用保障
一文详解 RocketMQ 如何利用 Raft 进行高可用保障
419 1
|
人工智能 供应链 安全
AI辅助安全测试案例某电商-供应链平台平台安全漏洞
【11月更文挑战第13天】该案例介绍了一家电商供应链平台如何利用AI技术进行全面的安全测试,包括网络、应用和数据安全层面,发现了多个潜在漏洞,并采取了有效的修复措施,提升了平台的整体安全性。
823 4
|
存储 关系型数据库 MySQL
Mysql全面总结
本文全面总结了MySQL的相关知识,涵盖思维导图、架构、存储引擎、数据类型、索引、查询、事务、锁机制、调优、分区与分表分库、主从复制及其他问题。MySQL采用插件式存储引擎架构,支持多种存储引擎,如InnoDB和MyISAM,每种引擎具备不同的特性。文章详细介绍了InnoDB和MyISAM的对比,包括事务支持、行级锁定、索引类型等。此外,还探讨了MySQL的查询优化、性能调优、主从复制等内容,适合数据库开发者和运维人员阅读。如涉及版权问题,请联系作者删除。
Mysql全面总结

热门文章

最新文章

下一篇
开通oss服务