斜优 90 pts 小数据没拍出来 QAQ
查看原帖
斜优 90 pts 小数据没拍出来 QAQ
317459
RyexAwl新暗车楼主2021/7/15 19:45

rt

#include <bits/stdc++.h>

#define rep(i,l,r) for (int i = l; i <= r; i++)
#define per(i,r,l) for (int i = r; i >= l; i--)
#define fi first
#define se second
#define prt std::cout
#define gin std::cin
#define edl std::endl


namespace wxy{

const int N = 5e6 + 10;

int f[N],sum[N],cnt[N],q[N];

int n,m,hh,tt;

inline int gety(int x){
    return sum[x] - f[x] - cnt[x] * x;
}

inline void insert(int idx){
    int y1 = gety(q[tt-1]),y2 = gety(q[tt]),x1 = q[tt-1],x2 = q[tt];
    int yins = gety(idx);
    while (hh < tt && (y1 - y2) * (x1 - idx) >= (y1 - yins) * (x1 - x2)) tt--;
    q[++tt] = idx;
}

inline void main(){
    #ifndef ONLINE_JUDGE
        freopen("in.in","r",stdin);
        freopen("out.out","w",stdout);
    #endif
    gin >> n >> m; int maxv = 0,ans = INT_MAX;
    rep(i,1,n){
        int x; gin >> x;
        cnt[x]++; maxv = std::max(maxv,x);
    }
    rep(i,0,maxv+m){
        sum[i] = i * cnt[i];
        if (i > 0) {
            sum[i] += sum[i-1];
            cnt[i] += cnt[i-1];
        }
    }
    rep(i,0,m) f[maxv + i] = 0;
    hh = 0; tt = 0; q[0] = maxv + m;
    per(i,maxv-1,0){
        insert(i + m);
        while (hh < tt && cnt[i] * (q[hh] - q[hh+1]) <= gety(q[hh+1]) - gety(q[hh])) hh++;
        int j = q[hh]; f[i] = (cnt[j] - cnt[i]) * j + f[j] - sum[j]; f[i] += sum[i];
    }
    rep(i,0,maxv)
        ans = std::min(ans,f[i] + cnt[i] * i - sum[i]);
    prt << ans;
}

}signed main(){wxy::main(); return 0;}
2021/7/15 19:45
加载中...