D - Ladder(區間&遞推)
題意:給定個數組成的數組,若干次區間詢問該區間是否爲峯形區間。
峯形區間即:
非遞減區間和非遞增區間也是峯形區間。
思路:對每個統計向左遞增的最大長度和向右遞增最大長度。
然後每次詢問判斷一下向右遞增的最大長度與向左遞增的最大長度之和是否大於等於區間長度.
這樣用兩個數組就能維護所有區間了。
時間複雜度:
AC代碼:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
const int N=1e5+5;
typedef long long ll;
int a[N],l[N],r[N];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),l[i]=r[i]=1;
for(int i=n-1;i>=1;i--)//向右遞增.
if(a[i]<=a[i+1])
r[i]=r[i+1]+1;
for(int i=2;i<=n;i++)//向左遞增.
if(a[i]<=a[i-1])
l[i]=l[i-1]+1;
while(m--){
int x,y;
scanf("%d%d",&x,&y);
if(r[x]+l[y]>=y-x+1)
puts("Yes");
else puts("No");
}
return 0;
}