蒟蒻全WA,考场0分求调
查看原帖
蒟蒻全WA,考场0分求调
638491
Illus1onary_Real1ty楼主2023/8/29 14:42

蒟蒻样例1过,2,3不知道(解压后把数据输进编译器后它直接炸了,可能是盗版的原因)

#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 = 1, 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;
	}//如果要排名第K,需要达到的值
	
	a[n+1].v = 2000000000;
	for (int i = 1; i <= n; i++){
		int pos1 = upper_bound(a+1, a+n+1, a[i], cmp)-a;
		f[i] = n - pos1 + 2;//当前f[i]
		int pos2 = lower_bound(a+1, a+n+1, a[i], cmp)-a;
		g[i] = n - pos2 + 1;//当前g[i]
		if (g[i] < k)
			ans[a[i].id] = (k-g[i])*a[pos2].v - (s[pos2-1]-s[pos2-(k-g[i])-1]);
            		//让所有比i小的数中最大的k-g[i]个等于a[i]
		else if (f[i] > k)
			ans[a[i].id] = tag - a[pos1-1].v;
            //让值加到tag
	}
   //f[i]小于等于g[i],所以其中一个达到k后就不管另一个
	
	for (int i = 1; i <= n; i++)
		cout << ans[i] << endl;
	
	return 0;
}

可能是思维上有漏洞

帮助者必关

2023/8/29 14:42
加载中...