牛客练习赛72—B:brz的雪糕

链接https://ac.nowcoder.com/acm/contest/8282/B

题意
有一个叫雪糕之王的家伙要吃雪糕。
雪糕之王每次吃雪糕时会选定一个区间[L,R],从左向右吃雪糕。

假如雪糕之王第 i 个吃掉的雪糕和上一个吃掉的类型相同,那么 雪糕之王 的愉悦值不会提升,否则愉悦值会 +1。
例如,当选定区间为1 1 2 3时,雪糕之王的愉悦度为3(有连续的相同种类雪糕1 1);
而当选定区间的雪糕为1 2 3 4 时,大王的愉悦度为4。

当雪糕大王吃第一块雪糕时愉悦度一定+1。(这个很好理解,每个区间内的第一块雪糕一定会让大王愉悦度+1)

第一行给出三个数字n(雪糕的个数),k(愉悦度),p(区间数)。
第二行给出n个数字,分别代表每块雪糕的种类。
接下来的p行中,每行给出两个数字L,R(代表从第L块雪糕开始吃,到第R个雪糕结束)。

对于每个区间,请问大王吃完雪糕后愉悦度是否能达到k,能输出Yes,不能则输出No

数据范围
在这里插入图片描述
思路
在A题把我憋死之后,我把希望就放在了B题上。
首先看了一下题之后,注意到数据和时间限制,就感觉这题已经不能暴力了。

这道题的做法就是建立一个h数组,h[i]代表的是在第i个数字之前(包含第i个数字),有多少对相邻且相同的数字。

h[1]=0;    //第一个数字对应的h[1]=0(就1个数字)
for(int i=2; i<=n; i++)
{
    if(a[i]==a[i-1])
        h[i]=h[i-1]+1;
    else
        h[i]=h[i-1];
}

然后对于每个输入的区间,我们先假设没有相邻一样的雪糕,愉悦度就应该是s-l+1
然后我们再看一下这个区间里有多少对相邻一样的,减去就好。

ans-=(h[r]-h[l]);

直接放代码,「伊丽莎白」!
在这里插入图片描述
代码

//这里不要用cin,会T掉
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+50;
int a[maxn],h[maxn];
int n,k,q,l,r;
int main()
{
    scanf("%d%d%d",&n,&k,&q);
    for(int i=1; i<=n; i++)
        scanf("%d",&a[i]);
    h[1]=0;
    for(int i=2; i<=n; i++)
    {
        if(a[i]==a[i-1])
            h[i]=h[i-1]+1;
        else
            h[i]=h[i-1];
    }
    for(int i=1; i<=q; i++)
    {
        scanf("%d%d",&l,&r);
        int ans=r-l+1;
        ans-=(h[r]-h[l]);
        if(ans<k)
            printf("No\n");
        else
            printf("Yes\n");
    }
}

倒霉的一天,从坏心情开始,到没爆0结束。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值