《算法竞赛·快冲300题》每日一题:“凹”

news2024/12/27 9:46:43

算法竞赛·快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。
所有题目放在自建的OJ New Online Judge。
用C/C++、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。

文章目录

  • 题目描述
  • 题解
  • C++代码
  • Java代码
  • Python代码

” ,链接: http://oj.ecustacm.cn/problem.php?id=1845

题目描述

【题目描述】 给定一个长度为n的数组a,请求出存在多少个二元组<i,j>满足“凹”的性质:
1、1≤i<j≤n;
2、对于所有的i<k<j均满足a[i]>a[k],a[j]>a[k]。
注意,当j=i+1时,k不存在,也满足上述约束。
  给 。
【输入格式】 第一行为正整数n,n≤1000000。
接下来n行,每行一个a[i],1≤a[i]≤n,a[i]不互相同。。
   。
【输出格式】 输出一个数字表示答案。。
【输入样例】

样例13
2
1
3

样例26
1
3
2
6
4
5 

【输出样例】

样例13

样例27 

题解

   首先模拟检查“凹”,了解执行的过程。以“3 1 2 6”为例,其中的“凹”有:“3 1 2”和“3 1 2 6”;还有j = i + 1的“3 1”、“1 2”、“2 6”。一共5个。
   像“3 1 2”和“3 1 2 6”这样的“凹”,需要检查连续的3个以上的数字。
   例如“3 1 2”,从“3”开始,下一个应该比“3”小,例如“1”,再后面的数字比“1”大,才能形成“凹”。
   再例如“3 1 2 6”,前面的“3 1 2”已经是“凹”了,最后的“6”也会形成新的“凹”,条件是这个“6”必须比中间的“1 2”大才行。
   总结上述过程是:先检查“3”;再检查“1”符合“凹”;再检查“2”,比前面的“1”大,符合“凹”;再检查“6”,比前面的“2”大,符合“凹”。
   以上是检查一个“凹”的两头,还有一种是“嵌套”。一旦遇到比前面小的数字,那么以这个数字为头,可能形成新的“凹”。例如“6 4 2 8”,其中的“6 4 2 8”是“凹”,二内部的“4 2 8”也是凹。如果学过递归、栈,就会发现这是嵌套,所以本题用栈来做很合适。
   以“3 1 2 6”为例,用栈模拟找“凹”。当新的数比栈内的数小,就进栈;如果比栈内的数大,就出栈,并记录找到了一个“凹”。
在这里插入图片描述

   然而,上述讨论隐含了一个前提,就是“凹”的尾部比头大,所以只能找到“头<尾”的“凹”。如何找“头>尾”的“凹”?只需反过来用栈执行一遍就行了。
【笔记】 栈的应用 。

C++代码

#include<bits/stdc++.h>
using namespace std;
int a[1000010];
stack<int>s;
int ans;
int main(){
    int n;  scanf("%d", &n);
    for(int i = 1; i <= n; i++)  scanf("%d", &a[i]);
    //从头到尾
    for(int i = 1; i <= n; i++){
        while(!s.empty() && s.top() < a[i])
            ans++, s.pop();
        s.push(a[i]);
    }
    while(!s.empty()) //清空栈s
        s.pop();
    //从尾到头
    for(int i = n; i >= 1; i--){
        while(!s.empty() && s.top() < a[i])
            ans++, s.pop();
        s.push(a[i]);
    }
    cout<<ans<<endl;
    return 0;
}

Java代码

import java.util.Scanner;
import java.util.Stack;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) 
            a[i] = sc.nextInt();        
        sc.close(); 
        Stack<Integer> s = new Stack<Integer>();
        int ans = 0;
         // 从头到尾
        for (int i = 0; i < n; i++) {
            while (!s.empty() && s.peek() < a[i]) {
                ans++;
                s.pop();
            }
            s.push(a[i]);
        }
         s.clear();
         // 从尾到头
        for (int i = n - 1; i >= 0; i--) {
            while (!s.empty() && s.peek() < a[i]) {
                ans++;
                s.pop();
            }
            s.push(a[i]);
        }
        System.out.println(ans);
    }
}

Python代码

   注意两点:用setrecursionlimit扩栈,用readline加快读入速度。

import sys
sys.setrecursionlimit(1000000)
input = sys.stdin.readline           #加这句后读入会快些
a = []
s = []
ans = 0
n = int(input())
for _ in range(n):  a.append(int(input()))
# 从头到尾
for i in range(n):
    while len(s) > 0 and s[-1] < a[i]:
        ans += 1
        s.pop()
    s.append(a[i])

s.clear()
# 从尾到头
for i in range(n-1, -1, -1):
    while len(s) > 0 and s[-1] < a[i]:
        ans += 1
        s.pop()
    s.append(a[i])
print(ans)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/792241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java SpringMvc

0目录 java SpringMvc拓展 1.SpringMvc 创建工程&#xff0c;导入依赖 配置 web.xml文件 配置Spring配置文件&#xff0c;resources目录下新建applicationContext.xml 控制层配置 新建list.jsp并测试 Web.xml详解 如果required是true必须要传参 设置默…

深度揭秘C++继承:理解面向对象编程的核心概念

目录 一.继承1.继承与面向对象2.继承方式访问权限3.切片&#xff08;赋值转换&#xff09;4.作用域5.默认成员函数6.友元与静态函数7.解决菱形继承的二义性与数据冗余8.继承与组合 一.继承 1.继承与面向对象 我们知道C语言是面向过程的编程语言&#xff0c;C在C语言的基础上进…

【TiDB理论知识06】PD架构与作用

目录 一 PD的架构与功能 PD架构 PD作用 名词解释 路由功能 二 TSO的分配 概念 分配过程 性能问题 高可用问题 三 PD的调度原理 总流程 1 信息收集 2 生成调度 3 执行调度 四 Label的作用 Label的配置 给TiKV打标签 PD配置 一 PD的架构与功能 PD架构 PD集群…

机器学习|学习类型-监督学习

让我们来讨论什么是机器学习如下所示&#xff1a; 如果机器在给定任务中的性能随着经验的改善而改善&#xff0c;则可以说机器正在从过去的经验&#xff08;数据馈入&#xff09;中学习某些类别的任务。例如&#xff0c;假设一台机器必须预测客户今年是否会购买特定的产品&…

指针进阶(三)

指针进阶&#xff08;三&#xff09; 指针习题组&#xff1a; 01&#xff1a; int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; }运行结果&#xff1a; 原因&#xff1a;这里a是数组名&a…

点云拟合球体

前言&#xff1a;在很多情况下&#xff0c;需要根据点云来拟合球体&#xff0c;本博文主要介绍各种方法的拟合情况及优缺点&#xff0c;希望对各位小伙伴有所帮助&#xff01; 目录 1. vtkFitImplicitFunction进行球拟合 2. 四点求解球 1. vtkFitImplicitFunction进行球拟合 …

汽车减震器弹簧阻尼模型及python代码

U为主动减震施加的力。 通过python control库&#xff0c;可以得到在单位脉冲激励下X1的响应曲线 import control import matplotlib.pyplot as pltM1 2500 M2 320 K1 80000 K2 500000 b1 350 b2 15020s control.TransferFunction.sH (b1*b2*s*s (b1*K2b2*K1)*s K1*…

foreverlasting and fried-chicken hdu7293

Problem - 7293 题目大意&#xff1a;给出一个n个点&#xff0c;m条边的图&#xff0c;问其中包含了几个下面这样的子图 1<n<1000; 思路&#xff1a;我们要找两个点u,v&#xff0c;他们至少有4个公共点&#xff0c;且至少有一个点的度数至少为6&#xff0c;其中还要判断…

【Nodejs】Koa基本使用

1.简介 koa 是由 Express 原班人马打造的&#xff0c;致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用&#xff0c;通过组合不同的 generator&#xff0c;可以免除重复繁琐的回调函数嵌套&#xff0c;并极大地提升错误处理的效率。koa 不在内核方…

Python+Playwright自动化测试--标签页操作(tab)

1.简介 标签操作其实也是基于浏览器上下文&#xff08;BrowserContext&#xff09;进行操作的&#xff0c;而且宏哥在之前的BrowserContext也有提到过&#xff0c;但是有的童鞋或者小伙伴还是不清楚怎么操作&#xff0c;或者思路有点模糊&#xff0c;因此今天单独来对其进行讲…

msvcr71.dll丢失或(找不到)的解决办法

在使用电脑有时候今天没有问题隔天我们再打开软件时候&#xff0c;就遇到电脑提示msvcr71.dll丢失的问题&#xff0c;完全不知道怎么回事跟怎么解决&#xff0c;今天本文章给大家详细介绍msvcr71.dll丢失的解决方法&#xff0c;跟丢失的原因。 1.是什么msvcr71.dll msvcr71.dl…

windows 抓取网页视频的url

fd抓视频链接 Filddler4官网&#xff1a; https://www.telerik.com/download/fiddler 复制 预先设置&#xff1a;打开 Fiddler&#xff0c;选择菜单栏 -> Tools -> Fiddler Options&#xff0c;在 HTTPS 选项卡中勾选 Decrypt HTTPS traffic&#xff0c;然后重启Fidd…

【云原生系列】openstack搭建过程及使用

目录 搭建步骤 准备工作 正式部署OpenStack 安装的过程 安装组件如下 登录页面 进入首页 创建实例步骤 上传镜像 配置网络 服务器配置 dashboard配置 密钥配置免密登录 创建实例 绑定浮动ip 免密登录实例 搭建步骤 准备工作 1.关闭防火墙和网关 systemctl dis…

Ip-Limit: 轻量级注解式IP限流组件(二)

author: van , ggfanwentaogmail.comIp-Limit-Example: 轻量级注解式IP限流组件使用样例 项目简介 该项目为ip-limiter的使用示例项目。 ip-limiter地址&#xff1a; https://github.com/DDAaTao/ip-limiter 示例项目文件树 └─example├─handler│ └─BaseException…

k8s部署高可用-redis

一、项目地址 ​GitHub - spotahome/redis-operator: Redis Operator creates/configures/manages high availability redis with sentinel automatic failover atop Kubernetes.​ 二、部署过程 一、部署operator控制器 1.把项目clone下来直接部署方便。 到这个目录下的这个…

springboot整合ELK+kafka采集日志

一、背景介绍 在分布式的项目中&#xff0c;各功能模块产生的日志比较分散&#xff0c;同时为满足性能要求&#xff0c;同一个微服务会集群化部署&#xff0c;当某一次业务报错后&#xff0c;如果不能确定产生的节点&#xff0c;那么只能逐个节点去查看日志文件&#xff1b;lo…

MySQL体系结构及执行过程

一、MySQL体系结构 1、网络连接层 客户端连接器&#xff08;Client Cnnectors&#xff09;&#xff1a;提供支持与MySQL服务器建立连接。 建立连接命令&#xff1a;mysql -h -u -p -h指定MySQL服务的IP 若本地连接则不需要 每一个连接均会保存用户权限&#xff0c;中途修改权…

关于在虚拟机CentOS7的Docker下安装Oracle

这不三阶段了&#xff0c;要上Oracle了&#xff0c;感觉这个班卷的程度到位。二阶段我就上了ElementUI和MyBatis&#xff0c;项目也是用这些技术写的&#xff0c;整体钻研程度还行。于是布置了两个任务&#xff1a;在windows下安一下Oracle&#xff0c;在windows下安装Oracle那…

从零开始制作CPU

文章目录 简介门与门或门非门异或门 ALU加法半加器全加器8位加法器 减法补码8位补码器8位减法器 存储锁存器8位锁存器带边沿触发的锁存器 内存内存单元16位内存 CPUPC程序计数器CPU连接 自制乘法器移位8位乘法器 自制除法器比较一位比较8位比较 8位除法器 简介 黑马最近出了个…

BOOTMGR丢失无法开机怎么办?

BOOTMGR&#xff08;引导管理器&#xff0c;Boot Manager的简称&#xff09;其实是一个引导操作系统的程序&#xff0c;通常位于系统保留分区或系统分区中。如果系统分区或系统保留分区的根目录中的BOOTMGR存在错误&#xff0c;那么系统将会在计算机启动时提示找不到操作系统。…