zoukankan      html  css  js  c++  java
  • bzoj 5127 数据校验

    题目大意:

    一个数列a

    对于 a 的一个区间 [l, r],若对于该区间 [l, r] 内的任意一个非空连续子区间,该子区间内出现过的数值在整数上值域连续,则称 [l, r]为合法区间

    m次询问  每次询问一个[l, r]是否为合法区间

    思路:

    由题可知 一个区间合法当且仅当任意两个相邻的数差值不超过 1

    然后只需要预处理出一个数组记录每个左端点最远可以到哪里即可

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstdlib>
     5 #include<algorithm>
     6 #include<cstring>
     7 #include<vector>
     8 #include<map>
     9 #include<queue>
    10 #define inf 2147483611
    11 #define ll long long
    12 #define MAXN 100100
    13 using namespace std;
    14 inline int read()
    15 {
    16     int x=0,f=1;
    17     char ch;ch=getchar();
    18     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    19     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
    20     return x*f;
    21 }
    22 int T,n,a[MAXN],res[MAXN];
    23 int main()
    24 {
    25     n=read(),T=read();
    26     for(int i=1;i<=n;i++) a[i]=read();
    27     int tmp=1;
    28     for(int i=2;i<=n;i++)
    29     {
    30         if(a[i]-a[i-1]>=-1&&a[i]-a[i-1]<=1) continue;
    31         else
    32         {
    33             for(int j=tmp;j<i;j++) res[j]=i-1;
    34             tmp=i;
    35         }
    36     }
    37     for(int i=tmp;i<=n;i++) res[i]=n;
    38     //for(int i=1;i<=n;i++) cout<<i<<" "<<res[i]<<endl;
    39     int a,b;
    40     while(T--)
    41     {
    42         a=read(),b=read();
    43         if(res[a]>=b) printf("YES
    ");
    44         else printf("NO
    ");
    45     }
    46 }
    View Code
  • 相关阅读:
    Ch5 关联式容器(上)
    Ch4 序列式容器(下)
    Ch4 序列式容器(上)
    DNN模型学习笔记
    关于换博客的说明
    睡前一小时数学之导数的学习与证明
    OpenJudge 666:放苹果 // 瞎基本DP
    OpenJudge 2990:符号三角形 解析报告
    OpenJudge1700:八皇后问题 //不属于基本法的基本玩意
    BZOJ1088扫雷Mine 解析报告
  • 原文地址:https://www.cnblogs.com/yyc-jack-0920/p/8159188.html
Copyright © 2011-2022 走看看