码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj5127[Lydsy12月赛]数据校验

时间:2018-02-07 14:44:38      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:pos   整数   题解   ret   return   ons   前缀   include   一个   

多少年不写题解了
题目描述:
著名出题人小 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\n");
    else if(d[r-1]-d[l-1]==0)printf("YES\n");
    else printf("NO\n");
  }
  return 0;
}

bzoj5127[Lydsy12月赛]数据校验

标签:pos   整数   题解   ret   return   ons   前缀   include   一个   

原文地址:https://www.cnblogs.com/liu-runda/p/8425974.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!