表演队(蓝桥)

这里

先考虑一个连续单调上升的区间,因为越稀疏差异值越大。它的差异值为

Sum=\sum _{j=l}^r a[j]*(j-l)-\sum _{i=l}^r a[i]*(r-i)

第一部分为x在区间中作为大数的和

第二部分为x在区间中作为小数的和

所以

Sum=\sum _{j=l}^ra[j]*(j-l)-\sum _{j=l}^ra[j]*(r-j)\\\\Sum=2*\sum _{j=l}^ra[j]*j-(l+r)\sum _{j=l}^ra[j]

第一部分用加权前缀和,第二部分用前缀和

//
// Created by yumo_
//
#include<bits/stdc++.h>

using namespace std;
#define scin std::cin
#define scout std::cout
using i64=long long;
const int INF=INT_MAX/2;
const i64 INFF=LLONG_MAX/2;
const int M=1e5+7;
int main() {

    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int T;
    // scin>>T;
    T=1;
    for (;T>0;--T) {
        int n,k;scin>>n>>k;
        std::vector<i64> a(n+5);
        for (int i=1;i<=n;++i) {
            scin>>a[i];
        }
        sort(a.begin()+1,a.begin()+n+1);
        std::vector<i64> pre(n+5);
        std::vector<i64> mpre(n+5);
        for (int i=1;i<=n;++i) {
            pre[i]=pre[i-1]+a[i];
            mpre[i]=mpre[i-1]+a[i]*i;
        }
        i64 mi=INFF;
        for (int l=1;l<=n;++l) {
            int r=l+k-1;if (r>n)break;
            i64 now=2*(mpre[r]-mpre[l-1]);
            now-=(l+r)*(pre[r]-pre[l-1]);
            mi=min(mi,now);
        }
        scout<<mi<<"\n";

    }



    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值