- C++
章节6 总结 天才ACM
- @ 2025-4-15 18:20:29
天才ACM
思路:倍增枚举分段即可。
代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+50;
int n,m,k;
int ans;
int a[N],s[N];
int sq(int x){
return x*x;
}
int check(int l,int r){
int idx=0;
for(int i=l;i<r;i++){
s[idx++]=a[i];
}
sort(s,s+idx);
int sum=0;
for(int i=0;i<m&&i<idx;i++,idx--){
sum+=sq(s[i]-s[idx-1]);
}
return sum;
}
signed main(){
int t;
cin >> t;
while(t--){
cin >> n >> m >> k;
for(int i=0;i<n;i++){
cin >> a[i];
}
ans=0;
int bg=0,ed=0;
while(ed<n){// 纯纯的倍增
int cd=1;
while(cd){
if(ed+cd<=n&&check(bg,ed+cd)<=k){
ed+=cd;
cd<<=1;
}else cd>>=1;
}
bg=ed;
ans++;
}
cout << ans << endl;
}
}
0 条评论
目前还没有评论...