比赛 20241025 评测结果 AAAAAAAAAA
题目名称 品质控制 最终得分 100
用户昵称 健康铀 运行时间 2.094 s
代码语言 C++ 内存使用 5.67 MiB
提交时间 2024-10-25 10:16:46
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long n,k,m,a[500010],b[500010],t,ans;
inline long long read(){
	register long long x=0,f=1;register char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int buc[256],b1[500010];
inline void radix_sort(long long a[],int l,int r){
	int radix=0;
	for(register int i=1;i<=4;i++){
		memset(buc,0,sizeof buc);
		for(register int j=l;j<=r;j++) 
		buc[(a[j]>>radix)&255]++;
		for(register int j=0;j<256;j++) 
		buc[j]+=buc[j-1];
		for(register int j=r;j>=l;j--) 
		b1[l+(buc[(a[j]>>radix)&255]--)-1]=a[j];
		for(register int j=l;j<=r;j++) 
		a[j]=b1[j];
		radix+=8;
	}
}
long long cxk(long long x,long long y){
	long long num=0;
	if(y>n)
	return 0;
	for(long long i=x;i<=y;i++){
		b[++num]=a[i];
	}
	if(num<=500)
	sort(b+1,b+num+1);
	else
	radix_sort(b,1,num);
	long long l=1,r=num,sum=0,res=0;
	while(l<r&&sum<=k&&++res<=m){
		sum+=(b[r]-b[l])*(b[r]-b[l]);
		l++;
		r--;
	}
	if(sum<=k){
		return 1;
	}
	return 0;
} 
int main(){
	freopen("cont.in","r",stdin);
	freopen("cont.out","w",stdout);
	cin>>t;
	while(t--){
		ans=0;
		n=read(),m=read(),k=read();
		for(long long i=1;i<=n;i++)
		a[i]=read();
		long long l=1,r=l,p=1;
		while(r<=n){
			if(p==0){
				ans++;
				l=r+1;
				r=l;
			}
			if(cxk(l,r+(1<<p)-1)==1){
				r=r+(1<<p)-1;
				p++;
			}
			else 
			p--;
		}
		cout<<ans<<endl;
	}
	return 0;
}