zoukankan      html  css  js  c++  java
  • bzoj5127[Lydsy12月赛]数据校验

    多少年不写题解了
    题目描述:
    著名出题人小 Q 出了一道题,这个题给定一个正整数序列 a1, a2, ..., an,并保证输入数据中,对于
    a 的任意一个非空连续子区间 [l, r],该区间内出现过的数值在整数上值域连续。
    现在小 Q 生成了一个长度为 n 的序列 b1, b2, ..., bn,他发现数据生成器似乎并不能保证数据合法,
    因此希望从中截取一段连续子区间作为测试数据。
    小 Q 选定了其中 m 个连续子区间 [l, r],请写一个程序,对于每个区间判断该区间是否满足条件。
    n,m<=1e5

    sb题....然而我看偏了搞出来一个log,写着写着发现自己傻了....
    合法的区间中所有长度为2的区间必然满足条件,所以相邻两个数字之差的绝对值必然满足条件.显然满足这个条件那么所有子区间都满足条件.
    前缀和一波判断一下就完了.O(n+m).

    #include<cstdio>
    const int maxn=500005;
    int b[maxn];
    int d[maxn];
    int main(){
      int n,m;scanf("%d%d",&n,&m);
      for(int i=1;i<=n;++i){
        scanf("%d",b+i);
      }
      for(int i=1;i<n;++i){
        d[i]=b[i]-b[i+1];
      }
      for(int i=1;i<n;++i){
        if(-1<=d[i]&&d[i]<=1){
          d[i]=0;
        }else{
          d[i]=1;
        }
      }
      for(int i=1;i<n;++i)d[i]+=d[i-1];
      for(int i=1,l,r;i<=m;++i){
        scanf("%d%d",&l,&r);
        if(l==r)printf("YES
    ");
        else if(d[r-1]-d[l-1]==0)printf("YES
    ");
        else printf("NO
    ");
      }
      return 0;
    }
    
  • 相关阅读:
    2-1(续)
    2-1
    28-69. Sqrt(x)
    27-75. Sort Colors
    26-78. Subsets
    MySQL--->存储引擎及图形化工具
    MySQL--->高级对象
    MySQL--->常用函数
    MySQL--->多表查询
    MySQL--->高级查询
  • 原文地址:https://www.cnblogs.com/liu-runda/p/8425974.html
Copyright © 2011-2022 走看看