70points,WA最后六个,求调
查看原帖
70points,WA最后六个,求调
638491
Illus1onary_Real1ty楼主2023/8/29 16:01
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

typedef long long ll;
const int N = 5e5 + 10;
ll c, n, k, f[N], g[N], s[N], ans[N];
struct node{
	ll v, id;
}a[N];

bool cmp(node x, node y){
	return x.v < y.v;
}

int main(){
	cin >> c >> n >> k;
	for (int i = 1; i <= n; i++){
		cin >> a[i].v;
		a[i].id = i;
	}
	sort(a + 1, a + n + 1, cmp);
	ll tag, cnt = 0, tmpcnt = 1;
	for (int i = 1; i <= n; i++)
		s[i] = s[i-1] + a[i].v;
	for (int i = n; i >= 1; i--){
		if (a[i].v != a[i+1].v){
			cnt += tmpcnt;
			tmpcnt = 1;
			if (cnt == k){
				tag = a[i].v;
				break;
			}else	if (cnt > k){
				tag = a[i+1].v;
				break;
			}
		}else	++tmpcnt;
	}
	
	a[n+1].v = 2000000000;
	for (int i = 1; i <= n; i++){
		int pos1 = upper_bound(a+1, a+n+2, a[i], cmp)-a;
		f[i] = n - pos1 + 2;
		int pos2 = lower_bound(a+1, a+n+2, a[i], cmp)-a;
		g[i] = n - pos2 + 1;
		if (g[i] < k)
			ans[a[i].id] = (k-g[i])*a[i].v - (s[i-1]-s[i-(k-g[i])-1]);
		else if (f[i] > k)
			ans[a[i].id] = tag - a[i].v;
	}
	
	for (int i = 1; i <= n; i++)
		cout << ans[i] << endl;
	
	return 0;
}
2023/8/29 16:01
加载中...