Atcoder ABC 255 D

我们又双叒叕见面啦!

今天,我就来把ABC255的D题给说一说!


这题给我的第一反应是:妈呀,怎么这么简单!
看到 $ Q \le 2 \times 10 ^ 5 $ 时,我又慌了,这咋办呀!

思路

首先如果只有一组的话,那么直接算 $ \Sigma ^ {n} _ {i=1} |a_i - x| $ 就行了。
但是这有很多组,暴力不行。
考虑绝对值优化:
比 $ x $ 小的算 $ mx - sum $,
比 $ x $ 大的算 $ sum - mx $。
考虑二分 $ x $ ,再排一次序,算前、后缀和,就做完了。
时间复杂度:$ O(n log n) $

代码

#include <iostream>
#include <string>
#include <cmath>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <set>
#include <map>
#include <utility>
#include <queue>
#include <vector>
#include <bitset>
#include <stack>
#include <sstream>
#include <algorithm>

using namespace std;

#define maxn 200005

long long A[maxn];
long long prefix[maxn], suffix[maxn];

int main() {
	int N, Q;
	scanf("%d %d", &N, &Q);
	for (int i = 0; i < N; i++) {
		scanf("%lld", &A[i]);
	}
	sort(A, A + N);
	prefix[0] = A[0];
	for (int i = 1; i < N; i++) {
		prefix[i] = prefix[i - 1] + A[i];
	}
	suffix[N - 1] = A[N - 1];
	for (int i = N - 2; i >= 0; i--) {
		suffix[i] = suffix[i + 1] + A[i];
	}
	while (Q--) {
		long long X;
		scanf("%lld", &X);
		long long int * place = lower_bound(A, A + N, X);
		int idx = place - A;
		printf("%lld\n", ((idx) * X - prefix[idx - 1]) + (suffix[idx] - (N - idx) * X));
	}
	return 0;
}
posted @ 2022-06-15 22:02  A-Problem-Solver  阅读(50)  评论(0编辑  收藏  举报