60pts求调(三个样例全过)
查看原帖
60pts求调(三个样例全过)
397743
Gocranis楼主2023/8/28 08:26
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node{
	int zhi;
	int id;
}a[500005];
int ans[500005];
int sl[500005];
int b[500005];
bool cmp(node x,node y)
{
	return x.zhi<y.zhi;
}
signed main()
{
//	freopen("rank2.in","r",stdin);
//	freopen("rank.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int c,n,k;
	cin>>c>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].zhi;
		a[i].id=i;
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)b[i]=a[i].zhi;
	for(int i=1;i<=n;i++)
	{
		int g=lower_bound(b+1,b+n+1,a[i].zhi)-b;
		int f=upper_bound(b+1,b+n+1,a[i].zhi)-b;
		g=n-g+1,f=n-f+1;
		f++;
		if(f<=k&&g>=k){
			ans[a[i].id]=0;
			continue;
		}
		else if(f>k)
		{
			ans[a[i].id]=a[n-k+1].zhi-a[i].zhi;
			continue;
		}
		else{
			if(a[i].zhi==a[i-1].zhi)
			{
				ans[a[i].id]=ans[a[i-1].id];
				sl[i]=sl[i-1];
				continue;
			}
			g=i-1;
			int gg=lower_bound(b+1,b+n+1,a[g].zhi)-b;
			ans[a[i].id]=ans[a[g].id]+(min((i-k-1),(g-gg+1))+sl[i-1])*(a[i].zhi-a[g].zhi);
			sl[i]=(min((i-k),(g-gg+1))+sl[i-1]);
		}
	}
	for(int i=1;i<=n;i++)cout<<ans[i]<<"\n";
	return 0;
}

红红绿绿的这是我WA的情况

2023/8/28 08:26
加载中...