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;
}