连号区间数

简介: 连号区间数

连号区间数

小明这些天一直在思考这样一个奇怪而有趣的问题:

在 1∼N 的某个排列中有多少个连号区间呢?

这里所说的连号区间的定义是:

如果区间 [L,R] 里的所有元素(即此排列的第 L 个到第 R 个元素)递增排序后能得到一个长度为 R−L+1 的“连续”数列,则称这个区间连号区间。

当 N 很小的时候,小明可以很快地算出答案,但是当 N 变大的时候,问题就不是那么简单了,现在小明需要你的帮助。

输入格式

第一行是一个正整数 N,表示排列的规模。

第二行是 N 个不同的数字 Pi,表示这 N 个数字的某一排列。

输出格式

输出一个整数,表示不同连号区间的数目。

数据范围

1≤N≤10000,

1≤Pi≤N

输入样例1:

4

3 2 4 1

输出样例1:

7

输入样例2:

5

3 4 2 5 1

输出样例2:

9

样例解释

第一个用例中,有 7 个连号区间分别是:[1,1],[1,2],[1,3],[1,4],[2,2],[3,3],[4,4]

第二个用例中,有 9 个连号区间分别是:[1,1],[1,2],[1,3],[1,4],[1,5],[2,2],[3,3],[4,4],[5,5]

时/空限制:1s / 64MB

总通过数:8851

总尝试数:14791

来源:第四届蓝桥杯省赛C++B组,第四届蓝桥杯省赛JAVAB组

算法思路

这个题的关键是 看懂题目 题目里面说的是 在 1∼N 的某个排列 这个排列的意思是 没有重复的数字

也就是说 如果 一段连续的数字 最大的数字 - 最小的数字 = 这段数字的长度 - 1那么代表这段数字

是符合题目要求的 因为没有重复的数字

提交代码

C++

/*
这个题的关键是 看懂题目 题目里面说的是 在 1∼N 的某个排列 这个排列的意思是 没有重复的数字
也就是说 如果 一段连续的数字 最大的数字 - 最小的数字 = 这段数字的长度 - 1那么代表这段数字
是符合题目要求的 因为没有重复的数字
*/
#include<bits/stdc++.h>
using namespace std;
int INF = 1e9;
const int N = 10010;
int a[N];
int res;
int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; ++ i) scanf ("%d", &a[i]);
    for (int i = 0; i < n; ++ i)
    {
        int mav = -INF, miv = INF;
        int j;
        for (j = i; j < n; ++ j) 
        {
            mav = max(mav, a[j]);
            miv = min(miv, a[j]);
            if (mav - miv == j - i) res ++;
        }
    }
    cout << res;
    return 0;
}

Java

import java.util.*;
import java.io.*;
public class Main
{
    static int INF = (int)1e9;
    static int [] a = new int [10010];
    static int res, n;
    public static void main(String[] args) throws IOException
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(reader.readLine());
        String [] strs = reader.readLine().split(" ");
        for (int i = 0; i < n; ++ i) a[i] = Integer.parseInt(strs[i]);
        for (int i = 0; i < n; ++ i)
        {
            int j;
            int mav = -INF, miv = INF;
            for (j = i; j < n; ++ j)
            {
                mav = Math.max(mav, a[j]);
                miv = Math.min(miv, a[j]);
                if (mav - miv == j - i) res ++;
            }
        }
        System.out.println(res);
    }
}


相关文章
|
8月前
|
存储 人工智能 JSON
AI智能体内战终结者!A2A:谷歌开源的首个标准智能体交互协议,让AI用同一种“语言”交流
A2A是谷歌推出的首个标准化智能体交互协议,通过统一通信规范实现不同框架AI智能体的安全协作,支持多模态交互和长时任务管理,已有50多家企业加入生态。
737 0
AI智能体内战终结者!A2A:谷歌开源的首个标准智能体交互协议,让AI用同一种“语言”交流
|
9月前
|
并行计算 Ubuntu Docker
kTransformers DeepSeek R1 部署全流程指南
kTransformers DeepSeek R1 部署全流程指南
|
资源调度 计算机视觉
图像处理之图像加噪
图像处理之图像加噪
339 0
图像处理之图像加噪
|
Python
openpyxl 学习笔记
openpyxl 学习笔记
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的高校学生综合素质评价系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的高校学生综合素质评价系统的详细设计和实现(源码+lw+部署文档+讲解等)
360 0
|
机器学习/深度学习 人工智能 Android开发
揭秘AI编程:从零开始构建你的第一个机器学习模型移动应用开发之旅:从新手到专家
【8月更文挑战第29天】本文将带你走进人工智能的奇妙世界,一起探索如何从零开始构建一个机器学习模型。我们将一步步解析整个过程,包括数据收集、预处理、模型选择、训练和测试等步骤,让你对AI编程有一个全面而深入的理解。无论你是AI初学者,还是有一定基础的开发者,都能在这篇文章中找到你需要的信息和启示。让我们一起开启这段激动人心的AI编程之旅吧! 【8月更文挑战第29天】在这篇文章中,我们将探索移动应用开发的奇妙世界。无论你是刚刚踏入这个领域的新手,还是已经有一定经验的开发者,这篇文章都将为你提供有价值的信息和指导。我们将从基础开始,逐步深入到更复杂的主题,包括移动操作系统的选择、开发工具的使用、
|
Java
Java面向对象编程,如何定义一个接口并在类中实现它?
Java面向对象编程,如何定义一个接口并在类中实现它?
334 1
|
负载均衡 应用服务中间件 nginx
|
小程序
基于微信小程序的驾校预约平台设计与实现(源码+lw+部署文档+讲解等)
基于微信小程序的驾校预约平台设计与实现(源码+lw+部署文档+讲解等)
205 2
基于微信小程序的驾校预约平台设计与实现(源码+lw+部署文档+讲解等)
|
DataWorks 数据建模 数据处理
《全链路数据治理-智能数据建模 》——大白话数据建模(1)
《全链路数据治理-智能数据建模 》——大白话数据建模(1)
584 0