题目描述

思路:用dp[i]表示吃掉第1块雪糕到第i块雪糕获得的愉悦值
再dp[r]-dp[l-1]与k比较就可以了
值得注意的是吃第1块雪糕愉悦值为1,如果dp[l]=dp[l-1],相当于吃第一块雪糕愉悦值为0
这种情况ans要+1
AC代码
#include <bits/stdc++.h>
using namespace std;
int dp[2000008];//dp[i]表示吃掉第1块雪糕到第i块雪糕获得的愉悦值
int main()
{
    int n,m,k,x,pre;
    scanf("%d%d%d",&n,&k,&m);
    dp[0]=0;
    for(int i=1; i<=n; ++i)
    {
        scanf("%d",&x);
        if(i==1)
        {
            dp[i]=1;
            continue;
        }
        if(pre!=x)//判断与前一个数是否相等
            dp[i]=dp[i-1]+1;
        else
            dp[i]=dp[i-1];
        pre=x;
    }
    while(m--)
    {
        int a,b,an;
        scanf("%d%d",&a,&b);
        an=dp[b]-dp[a-1];
        if(dp[a]==dp[a-1])//吃第1块雪糕愉悦值为1,如果dp[a]=dp[a-1]
            an++;         //相当于吃第一块雪糕愉悦值为0
        if(an>=k)
            puts("Yes");
        else
            puts("No");
    }
}
//dp[i]表示吃掉第1块雪糕到第i块雪糕获得的愉悦值