50分TLE求调,我觉得我的时间复杂度能过。求大佬帮忙优化,悬关
查看原帖
50分TLE求调,我觉得我的时间复杂度能过。求大佬帮忙优化,悬关
510910
jiangmingshuai楼主2023/8/28 11:43
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
long long c,n,k,tot;
long long a[N],b[N],z[N],w[N];
map<long long ,long long> m,f,g,xiao,wei;
long long read(){
	long long s=1,h=0;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') s=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		h=h*10+ch-'0';
		ch=getchar();
	}
	return s*h;
}
int main(){
	c=read();
	n=read();
	k=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
		b[i]=a[i];
		m[a[i]]++;
		xiao[a[i]]=LLONG_MAX;
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++){
		z[i]=z[i-1]+a[i];
	}
	long long q=1;
	for(int i=1;i<=n;i++){
		if(f[a[i]]) continue;
		f[a[i]]=n-(i+m[a[i]]-1);
		g[a[i]]=f[a[i]]+m[a[i]];
		f[a[i]]++;
		if(f[a[i]]<=k&&k<=g[a[i]]){
			w[q]+=a[i];
			w[i+m[a[i]]]-=a[i];
			q=(i+m[a[i]]-1);
		}
	}
	for(int i=1;i<=n;i++){
		w[i]+=w[i-1];
		if(w[i]) xiao[a[i]]=w[i]-a[i];
	}
	for(int i=1;i<=n;i++){
		if(f[a[i]]>k||wei[a[i]])continue;
		wei[a[i]]=1;
		long long res=0,fk=k-f[a[i]],yk=0,q=i;
		res=z[i-1]-z[i-fk-1];
		res=(fk*a[i]-res);
		xiao[a[i]]=min(xiao[a[i]],res);
	}
	for(int i=1;i<=n;i++){
		printf("%lld\n",xiao[b[i]]);
	}
	return 0;
}
2023/8/28 11:43
加载中...