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\n");
    else if(d[r-1]-d[l-1]==0)printf("YES\n");
    else printf("NO\n");
  }
  return 0;
}
posted @ 2018-02-07 12:01  liu_runda  阅读(512)  评论(0编辑  收藏  举报
偶然想到可以用这样的字体藏一点想说的话,可是并没有什么想说的. 现在有了:文化课好难