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;//
}
}

浙公网安备 33010602011771号