zoukankan      html  css  js  c++  java
  • 历届试题 连号区间数

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 using namespace std;
     5 int a[50005];
     6 int main()
     7 {
     8     int i,j,maxn,minn,n,ans=0;
     9     scanf("%d",&n);
    10     for(i=1;i<=n;i++)
    11     scanf("%d",&a[i]);
    12     for(i=1;i<=n;i++)
    13     {
    14         minn=n;
    15         maxn=1;
    16         for(j=i;j<=n;j++)
    17         {
    18             maxn=max(maxn,a[j]);
    19             minn=min(minn,a[j]);
    20             if(maxn-minn==j-i)
    21             ans++;
    22         }
    23     }
    24     printf("%d
    ",ans);
    25     return 0;
    26 }
    View Code

     历届试题 连号区间数  

    时间限制:1.0s   内存限制:256.0MB
          
    锦囊2
    从左到右扫描数组,将所有扫描到的数放到并查集中,将相邻的数在集合中合并。对于每个合并的集合记录下递增可连的次数和递减可连的次数以及数字出现的最早和最晚时刻。当新扫描的数过来时根据以上几个值来合并区间并维护。
    问题描述

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

    在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
     
    因为n个数字肯定是1~n,那么在某个区间内,最大的数减去最小的数为区间长的话,那么这个区间肯定是连号区间无疑。。。
     
  • 相关阅读:
    Ubuntu下用NdisWrapper安装网卡驱动
    Ubuntu下轻松切换GDM, LightDM , KDM
    Ubuntu常用软件推荐,图文详细说明及下载
    Matlab绘图-很详细,很全面
    安装sunvirtualbox
    Ubuntu下使用虚拟机安装Windows XP(sunvirtualbox)
    Ubuntu下安装vmware 9.0 + 注册码
    Linux如何用QQ?Linux下QQ使用的几种方案
    怎么解决 ubuntu 装kde桌面遇到的汉化问题
    Ubuntu下安装KDE及安装中文环境
  • 原文地址:https://www.cnblogs.com/zeze/p/qujianshu.html
Copyright © 2011-2022 走看看