热门景点题解

热门景点题解



思路分析

​ 题目意思并不难,就是如果对于每个查询区间,如果只存在一个极大值点(即 a_{i-1}\le a_i> a_{i+1} ),则输出Y,否则输N。

当然我们也可以发现,不满足条件的区间都至少存在一个极小值点(即 a_{i-1}>a_i\le a_{i+1} ),所以我们便可以预处理出每个极小值点,再对其做前缀和,如果满足 sum_{r-1}-sum_{l}\ge1 则我们可以说这个区间至少存在一个极小值点。预处理 O(n) ,查询 O(1)

​ 这题并不难,主要是读入优化,普通的快读满足不了需求,需使用超快读

代码实现

#include<iostream>
#include<cstdio>
using namespace std;
const int N=1e7+7;
int n,q,a[N],lmin[N],smin[N];
inline char bit(){
static char buf[1005],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1005,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
#define getchar() bit()
    char x=getchar();int t=0;
    while(!isdigit(x))x=getchar();
    while(isdigit(x))t=(t<<3)+(t<<1)+(x^48),x=getchar();
    return t;
}
int main(){
    n=read();q=read();
    for(int i=1;i<=n;++i){
        a[i]=read();
    }
    for(int i=2;i<=n-1;++i){
        if(a[i-1]>a[i]&&a[i]<=a[i+1]) lmin[i]=1;
      smin[i]=smin[i-1]+lmin[i];
    }
    for(int i=1;i<=q;++i){
        int l,r;
        l=read();r=read();
        if(abs(l-r)<=1){
            putchar('Y');putchar('\n');
            continue;
        }
        if(smin[r-1]-smin[l]<1){
            putchar('Y');putchar('\n');
        }
        else{
            putchar('N');putchar('\n');
        }
    }
    return 0;
}