牛客练习赛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结束。
上一篇: 1019 数字黑洞 (20分)
下一篇: 1019 数字黑洞 (20分)