时间复杂度正确(倍增求右端O(logn),求SPD O(m+n))但TLE最后两个测试点。
#include<bits/stdc++.h>
#define int long long int
using namespace std;
int a[500010],k,m,n,s,t,x,y,z;
int b(int l,int r){
int o=0,u=0;
priority_queue<int>p;
priority_queue<int,vector<int>,greater<int> >q;
for(int i=l;i<=r;i++){
p.push(a[i]);
q.push(a[i]);
}
u=min((r-l+1)/2,m);
while(u--){
o+=(p.top()-q.top())*(p.top()-q.top());
p.pop();
q.pop();
}
return o;
}
inline int read(){
char c;
int d=0,e=1;
c=getchar_unlocked();
while(!isdigit(c)){
if(c=='-') e=-1;
c=getchar_unlocked();
}
while(isdigit(c)){
d=(d<<1)+(d<<3)+(c^48);
c=getchar_unlocked();
}
return d*e;
}
void print(long long int d){
if(d<0){
putchar_unlocked('-');
d=-d;
}
if(d<10) putchar_unlocked(d+48);
else{
print(d/10);
putchar_unlocked(d%10+48);
}
}
signed main(){
ios::sync_with_stdio(0);
t=read();
while(t--){
n=read();
m=read();
k=read();
for(int i=0;i<n;i++) a[i]=read();
s=x=y=0;
while(y<n){
z=1;
while(z){
if(y+z<n&&b(x,y+z)<=k){
y+=z;
z<<=1;
}
else z>>=1;
}
x=++y;
s++;
}
print(s);
putchar('\n');
}
return 0;
}