[第四届蓝桥杯省赛C++B组]连号区间数

来源: 第四届蓝桥杯省赛C++B组
算法标签 枚举
题目描述

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

在 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]

思路

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

输入样例1:

4
3 2 4 1

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

1.因为连号必须满足 A.单调递增子序列 B.自身
2.因为 任意子序列中 虽有的数字必须被使用完 才能表明符合单调递增子序列
3.模拟成 左右两个端点循环 当右端点-左端点 等于 当前最大值 - 当前最小值
则表明 从左端点到右端点的所有数都被使用 是单调递增子序列 (且 该情况对a[i] - a[i] 同样适用
则答案+1

枚举所有区间,如果最大值减最小值等于区间长度,则表明用光了所有数据且是连号,则是连号区间

C++ 代码
#include<iostream>

using namespace std;
const int N=1e4+10,INF=1e8;
int a[N];

int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    
    int cnt=0;
    for(int i=1;i<=n;i++)   
        {
            int maxv=-INF,minv=INF;
            for(int j=i;j<=n;j++)
                {
                    maxv=max(a[j],maxv),minv=min(a[j],minv);
                    if(maxv-minv==j-i)cnt++;
                }
        }
    cout<<cnt;
    return 0;
}
### 第十四届蓝桥杯 C++ B详情 #### 比题目概述 第十四届蓝桥杯C++ B的题目涵盖了多个算法和据结构的知识点。这些题目旨在考察选手的基础编程能力以及解决实际问题的能力[^2]。 #### 题目难度分析 对于部分题目,可以采用较为简单的解法来获取一定分。例如,在处理某些特定类型的字符串匹配问题时,虽然最直观的方法是使用双重`for`循环遍历所有可能的子串合,但这会导致时间复杂度过高而无法在规定时间内完成计算(即TLE, Time Limit Exceeded)。然而,在竞环境中,这种方法仍然可以帮助参者获得一些测试用例的部分得分[^4]。 #### 参规则要点 为了确保公平竞争并促进学习交流,比期间允许使用计算器辅助运算工具。这一设置体现了主办方希望降低不必要的手工计算负担,使参与者能够更专注于逻辑思考与编码实现上[^3]。 #### 成绩查询方式 关于具体的成绩公布时间和途径,请关注官方渠道发布的最新通知。通常情况下,成绩会在后一段时间内由委会统一发布,并可通过指定网站或平台进行查询。 ```python # 示例:如何在线提交代码至评测系统(假设) import requests def submit_code(problem_id, code): url = "https://example.com/submit" payload = { 'problemId': problem_id, 'code': code } response = requests.post(url, data=payload) return response.json() # 使用示例 result = submit_code(1001, """ #include <iostream> using namespace std; int main() { cout << "Hello World!"; return 0; } """) print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

俺叫西西弗斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值