• 蓝桥杯 连号区间数


    问题描述

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

    在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是:

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

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

    输入格式

    第一行是一个正整数N (1 <= N <= 50000), 表示全排列的规模。

    第二行是N个不同的数字Pi(1 <= Pi <= N), 表示这N个数字的某一全排列。

    输出格式

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

    样例输入1
    4
    3 2 4 1
    样例输出1
    7
    样例输入2
    5
    3 4 2 5 1
    样例输出2
    9
     

    【只要这个区间里的最大值减最小值==区间长度   就说明这是连号区间】

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<math.h>
     6 using namespace std;
     7 
     8 int a[50005];
     9 
    10 int main()
    11 {
    12     int n;
    13     while(~scanf("%d",&n))
    14     {
    15         for(int i=0;i<n;i++)
    16             scanf("%d",&a[i]);
    17         int ans;
    18         ans=n;
    19         for(int i=0;i<n;i++)
    20         {
    21             int maxx=a[i],minn=a[i];
    22             for(int j=i+1;j<n;j++)
    23             {
    24                 if(a[j]>maxx)
    25                     maxx=a[j];
    26                 if(a[j]<minn)
    27                     minn=a[j];
    28                 if((maxx-minn)==(j-i))                    
    29                     ans++;
    30             }
    31         }
    32         printf("%d
    ",ans);
    33     }
    34     return 0;
    35 }
  • 相关阅读:
    [SNOI2019]数论
    [HNOI2019]校园旅行
    [TJOI2019]唱、跳、rap和篮球
    [Ctsc2015]misc
    [IOI2018] meetings 会议
    [ZJOI2019]语言
    51nod1600 Simple KMP
    [APIO2013]道路费用
    [FJOI2018]领导集团问题
    [ZJOI2012]小蓝的好友
  • 原文地址:https://www.cnblogs.com/assult/p/3562528.html
Copyright © 2020-2023  润新知