Educational Codeforces Round 170 (Rated for Div. 2) C题题解

题目链接:https://codeforces.com/contest/2025/problem/C

如下:

查看代码
 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,a[500050];
ll n,m,k,b[500050]={0};
int main(){
	cin>>t;
	while(t--){
		cin>>n>>k;
		ll v=1,ro=1,sum=0,miax=0;
		for(int i=0;i<n;i++){
			cin>>a[i];
		}
		a[n]=0;//对每次输入的n+1项重置,防止数据影响;
		sort(a,a+n);//将n个数排序方便遍历;
		for (int i = 0;i < n; i ++){
			if(a[i]==a[i+1]){
				ro++;//对相同的数计数;
			}
			if(a[i]!=a[i+1]){	//sum为当前连续的总和;
				b[v]=b[v-1]+ro;//利用前缀和对相差为1的数的数量计数;
				if(v>=k) sum = max(sum, b[v] - b[v - k]);//找出在连续相差为1中长度的k项最大的;
			    else sum+=ro;//如果没有直接加上长度;
			    ro=1;//长度计数重置;
			    v++;//前缀和计数++;
			    if(a[i+1]-a[i]!=1){ //如果不连续;
				    miax=max(sum,miax);//与最大值比较;
				    sum=0;//重置总和;
				    v=1;//前缀和计数重置;
			    }
		   }
        }
		cout<<miax<<endl;//
	}
}

 

posted @ 2024-10-17 18:26  薇尔莉特·伊芙加登  阅读(18)  评论(0)    收藏  举报