天才ACM

#include<iostream>
#include<algorithm>
using namespace std;
using ll= long long;
const int N=5e5+10;
int n,m,ans;
ll T,w[N],t[N],tmp[N];
ll sq(ll x){
	return x*x;
}
bool check(int left,int mid,int r){
	for(int i=mid;i<r;++i){
		t[i]=w[i];
		
	}
	sort(t+mid,t+r);
	int i=left,j=mid,k=0;
	while(j!=r&&i!=mid){
		if(t[i]<t[j]){
			tmp[k++]=t[i++];
		}else{
			tmp[k++]=t[j++];
		}
	}
	while(i!=mid){
		tmp[k++]=t[i++];
	}
	while(j!=r){
		//TODO keep move
		tmp[k++]=t[j++];
	}
	ll sum=0;
	for(i=0;i<m&&i<k;++i,--k){
		sum+=sq(tmp[i]-tmp[k-1]);
	}
	return sum<=T;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int k;
	cin>>k;
	while(k--){
		//TODO input
		cin>>n>>m>>T;
		for(int i=0;i<n;++i){
			cin>>w[i];
			
		}
		ans=0;
		int len,start=0,iend=0;
		while(iend<n){
			len=1;
			
			while(len){
				if(iend+len<=n && check(start,iend,iend+len)){//legal index check
					iend+=len,len<<=1;
					if(iend>=n){//pruning
						break;
					}
					for(int i=start;i<iend;++i){
						t[i]=tmp[i-start];
					}
				}else{
					len>>=1;
				}
			}
			start=iend;
			++ans;
		}
		cout<<ans<<'\n';
		
		
	}
	return 0;
	
}
posted @ 2022-03-22 09:56  ethon-wang  阅读(32)  评论(0编辑  收藏  举报