brz的雪糕
https://ac.nowcoder.com/acm/contest/8282/B
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
蒟蒻 brz\text{brz}brz 买了 n 个雪糕进献给雪糕之王 lzy\text{lzy}lzy,但是他发现了一个难题……
雪糕之王 lzy\text{lzy}lzy 吃雪糕是很挑剔的,每次他会选一个区间 [l,r],从左到右依次吃掉雪糕,假如第 i 个吃掉的雪糕和上一个吃掉的类型相同,那么 lzy\text{lzy}lzy 的愉悦值不会提升,否则愉悦值会 +1,特别的,吃第一个雪糕时愉悦值会 +1。
蒟蒻 brz\text{brz}brz 脑补了一些 lzy\text{lzy}lzy 会吃的雪糕区间,他想要知道这些区间能带给 lzy\text{lzy}lzy 的愉悦值是否不小于 k。
雪糕之王 lzy\text{lzy}lzy 吃雪糕是很挑剔的,每次他会选一个区间 [l,r],从左到右依次吃掉雪糕,假如第 i 个吃掉的雪糕和上一个吃掉的类型相同,那么 lzy\text{lzy}lzy 的愉悦值不会提升,否则愉悦值会 +1,特别的,吃第一个雪糕时愉悦值会 +1。
蒟蒻 brz\text{brz}brz 脑补了一些 lzy\text{lzy}lzy 会吃的雪糕区间,他想要知道这些区间能带给 lzy\text{lzy}lzy 的愉悦值是否不小于 k。
输入描述:
第一行两个整数 n,k,q,n,k 意义如上所述,q 表示蒟蒻 brz\text{brz}brz 脑补的 lzy\text{lzy}lzy 可能会吃的雪糕区间。
第二行 n 个整数,第 i 个整数 aia_iai 表示第 i 个雪糕的类型。
下面 q 行每行两个整数 xi,yix_i,y_ixi,yi,表示 lzy\text{lzy}lzy 可能会吃 [xi,yi][x_i,y_i][xi,yi] 这个雪糕区间。
1≤k≤n≤2×106,1≤q≤5×106,1≤ai≤1091\leq k\leq n\leq 2\times 10^6,1\leq q\leq 5\times 10^6,1\leq a_i\leq 10^91≤k≤n≤2×106,1≤q≤5×106,1≤ai≤109。
输出描述:
输出 q 行,第 i 行表示当 lzy\text{lzy}lzy 吃的雪糕区间为 [xi,yi][x_i,y_i][xi,yi] 时,他能获得的愉悦值是否不小于 k,如果是,输出`Yes`,否则输出`No`。
示例1
说明
区间 [1,4] 能带来的愉悦值为 3,区间 [2,5] 能带来的愉悦值为 4。
分析:cin,cout别用用会超时,for循环暴力会超时,关了流输入也超时。
所以要在建立一个数组,记录相邻是否是不一样的并且累和,才能达到要求的时间复杂度
1 // 2 // Created by w on 2020/11/6. 3 // 4 5 #include<iostream> 6 using namespace std; 7 const int N=2e6+20; 8 int arr1[N]; 9 int arr2[N]={0}; 10 int main() 11 { 12 //ios::sync_with_stdio(false); 13 int n,k,q; 14 scanf("%d%d%d",&n,&k,&q); 15 int sum=1; 16 for(int i=1;i<=n;i++) 17 { 18 scanf("%d",&arr1[i]); 19 20 } 21 arr2[1]=0; 22 for(int i=2;i<=n;i++) 23 { 24 if(arr1[i]==arr1[i-1]) 25 arr2[i]=arr2[i-1]+1; 26 else 27 arr2[i]=arr2[i-1]; 28 } 29 while(q--) 30 { 31 sum=0; 32 int m,n; 33 scanf("%d%d",&m,&n); 34 int ans=n-m+1; 35 ans-=arr2[n]-arr2[m]; 36 //cout<<"sum"<<sum<<endl; 37 if(ans>=k) 38 printf("Yes\n"); 39 else 40 printf("No\n"); 41 } 42 return 0; 43 }

浙公网安备 33010602011771号