Codeforces 279C
思路:dp[i]表示a[i]之前连续的比a[i]大的数的个数,rdp[i]表示a[i]之后连续的比a[i]大的数的个数。如果dp[st] + rdp[end] >= end - st + 1,则是Yes,否则No。
#include<iostream> #include<cstdio> #include<cstring> #define MAX 100005 using namespace std; int a[MAX], dp[MAX], rdp[MAX]; int main(){ int n, Q, st, end; /* freopen("in.c", "r", stdin); */ while(~scanf("%d%d", &n, &Q)){ memset(dp, 0, sizeof(dp)); memset(rdp, 0, sizeof(rdp)); memset(a, 0, sizeof(a)); for(int i = 1;i <= n;i ++) scanf("%d", &a[i]); for(int i = 1; i <= n;i ++){ if(a[i] <= a[i-1]) dp[i] = dp[i-1] + 1; else dp[i] = 1; } for(int i = n;i >= 1;i --){ if(a[i] <= a[i+1]) rdp[i] = rdp[i+1] + 1; else rdp[i] = 1; } for(int i = 0;i < Q;i ++){ scanf("%d%d", &st, &end); if(rdp[st] + dp[end] >= end - st + 1) printf("Yes\n"); else printf("No\n"); } } return 0; }