比赛 |
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;
}