求调
查看原帖
求调
1050072
a18981826590楼主2024/8/20 16:58

时间复杂度正确(倍增求右端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;
}
2024/8/20 16:58
加载中...