Loading

题解:P17386 [PacNW 2025] Kth King

题目大意

给出一个序列,每次操作可以让一个元素加一或者减一,求出需要进行多少次操作,才能使所有长度 \(\ge k\) 的连续子序列的第 \(k\) 大的数相等。

思路

容易想到最大的 \(k-1\) 个数字一定不变,剩下的数字全部变为同一个数字,这个数字是多少呢?
我们考虑一个问题,如果现在有 \(a_1,a_2,a_3,……,a_n\) 这 \(n\) 个数,需要找出一个数 \(p\),使得 \(\sum_{i=1}^{n}|a_i-p|\) 的值最小,容易得到 \(p\) 应该取这些数字的中位数。
所以我们首先对数组从大到小进行排序,求前缀和,然后求出对于每一任国王求出答案即可。
记得开 long long!

#include<bits/stdc++.h>
using namespace std;
const int MAXN=2E5+5;
long long n,a[MAXN];
long long pre[MAXN];//方便求出区间的和
int main(){
    cin>>n;
    for(int i=1;i<=n;++i)
        cin>>a[i];
    sort(a+1,a+1+n,greater<int>());
    for(int i=1;i<=n;++i)
        pre[i]=pre[i-1]+a[i];
    for(int i=1;i<=n;++i){
        int t=(n-i+1);//剩下的城市个数
        cout<<pre[i+t/2-1]-pre[i-1]-a[i+t/2]*(t/2)+a[i+t/2]*(n-i-t/2)-pre[n]+pre[i+t/2]<<endl;
    }
    return 0;
}
posted @ 2026-09-27 16:50  heffo_hard  阅读(8)  评论(0)    收藏  举报