#include using namespace std; const int INF = 0x3f3f3f3f; const int N = 4000010; int ans = INF; int cnt[N], sum[N], f[N]; int n, m; // 等车人数和摆渡车往返一趟的时间 int T; // T表示最后一个同学到达车站的时间 int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { int t; cin >> t; T = max(T, t); cnt[t]++; sum[t] += t; } // 注意,这里应计算到最后一同学可能等到的时间 T + m - 1 for (int i = 1; i < T + m; i++) { cnt[i] += cnt[i - 1]; // 求人数的前缀和 sum[i] += sum[i - 1]; // 求时间的前缀和 } for (int i = 1; i < T + m; i++) { // 可以多通过6个测试点 if (i >= m && cnt[i] == cnt[i - m]) { f[i] = f[i - m]; continue; } f[i] = i * cnt[i] - sum[i]; // 特殊处理i