当前位置:网站首页>连号区间数
连号区间数
2022-07-30 21:46:00 【Ding Jiaxiong】
题目
小明这些天一直在思考这样一个奇怪而有趣的问题:
在 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]
思路分析



题解
#include<iostream>
#include<cstring>
using namespace std;
const int N = 10010,INF = 100000000;
int n ;
int a[N];
int main(){
cin >> n;
//读入数据
for(int i = 0 ; i < n; i++){
cin >> a[i];
}
int res = 0;
for(int i = 0; i < n; i++){
//区间左端点
int minv = INF , maxv = -INF;
//枚举右端点
for(int j = i;j < n; j ++){
minv = min(minv , a[j]);
maxv = max(maxv , a[j]);
if(maxv - minv == j - i){
res ++;
}
}
}
cout << res << endl;
return 0;
}

边栏推荐
猜你喜欢
随机推荐
ML.NET相关资源整理
数据指标口径不统一、重复开发?亿信ABI指标管理平台帮你解决
Google Earth Engine ——我们如何筛选一个列表中的排序以时间为例
关于MySQL主从复制的数据同步延迟问题
Navicat cannot connect to mysql super detailed processing method
设备树的引入与体验
3 minutes to take you to understand WeChat applet development
IDEA2021.2安装与配置(持续更新)
mysql remove duplicate data
The reason for not using bs4 is that the name is too long?Crawl lottery lottery information
MySQL 5.7 detailed download, installation and configuration tutorial
HCIP第十六天
MySQL user authorization
LeetCode·23.合并K个升序链表·递归·迭代
Niu Ke Xiaobaiyue Race 53 A-E
Google Earth Engine ——ee.List.sequence函数的使用
The mysql time field is set to the current time by default
The most powerful and most commonly used SQL statements in history
Advanced c language: pointers (5)
kubernetes









