欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-13 13:37:29
...

链接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

数据范围
牛客练习赛72—B:brz的雪糕
思路
在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]);

直接放代码,「伊丽莎白」!
牛客练习赛72—B:brz的雪糕
代码

//这里不要用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结束。

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