求助,#9#10WA
  • 板块P10455 Genius Acm
  • 楼主hjwam
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/23 20:19
  • 上次更新2024/10/23 21:26:14
查看原帖
求助,#9#10WA
691468
hjwam楼主2024/10/23 20:19
#include<bits/stdc++.h>
using namespace std;
const int N=514191;
int T,n,m,k;
long long p[N],a[N],b[N];
void merge(int l,int r,int mid){
	int i=l,j=mid+1,t;
	for(t=l;t<=r;++t)
		if(j>r||i<=mid&&a[i]<=a[j]) b[t]=a[i++];
		else b[t]=a[j++];
}
bool check(int l,int r,int mid){
	if(r>n) r=n;
	for(int i=mid+1;i<=r;++i) a[i]=p[i];
	sort(a+mid+1,a+r+1);
	merge(l,r,mid);
	long long ans=0;
	for(int i=0;i<min(m,r-l+1>>1);++i)
		ans+=(b[r-i]-b[l+i])*(b[r-i]-b[l+i]);
	if(ans>k) return false;
	for(int i=l;i<=r;++i) a[i]=b[i];
	return true;
}
int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d%d%d",&n,&m,&k);
		for(int i=1;i<=n;++i)
			scanf("%lld",p+i);
		int res=0,l=1,r=1,t=1;
		a[l]=p[l];
		while(r<=n){
			while(t){
				if(check(l,r+t,r)){
					r=min(r+t,n);
					t<<=1;
				}
				else t>>=1;
			}
			l=++r; t=1; res++;
		}
		printf("%d\n",res);
	}
  return 0;
}	
/*
1
5 1 36
1 7 3 8 9

2
*/ 
2024/10/23 20:19
加载中...