結果
| 問題 |
No.3303 Heal Slimes 2
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-10-05 16:29:22 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,277 bytes |
| コンパイル時間 | 4,166 ms |
| コンパイル使用メモリ | 266,644 KB |
| 実行使用メモリ | 10,752 KB |
| 最終ジャッジ日時 | 2025-10-05 16:29:31 |
| 合計ジャッジ時間 | 8,388 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 5 WA * 25 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using ll = long long;
constexpr int INF = 1 << 29;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
ll n, k, d;
cin >> n >> k >> d;
vector<ll> a(n), c;
for(auto &&v : a) cin >> v;
c = a;
sort(c.begin(), c.end());
atcoder::fenwick_tree<ll> fw1(n), fw2(n);
multiset<ll> L, M, R;
auto add = [&](ll p, int v){
int pos = lower_bound(c.begin(), c.end(), p) - c.begin();
fw1.add(pos, v);
fw2.add(pos, v * p);
};
auto update = [&](){
if(!M.empty()){
while(true){
ll mn = *M.begin();
ll mx = *M.rbegin();
if(mx - mn > d){
if(L.size() < R.size()){
L.insert(mn);
M.erase(M.find(mn));
add(mn, 1);
}else{
R.insert(mx);
M.erase(M.find(mx));
add(mx, 1);
}
}else{
break;
}
}
}
while(L.size() >= R.size() + 2){
ll v = *L.rbegin();
L.erase(L.find(v));
add(v, -1);
M.insert(v);
while(true){
ll mn = *M.begin();
ll mx = *M.rbegin();
if(mx - mn > d){
R.insert(mx);
M.erase(M.find(mx));
add(mx, 1);
}else{
break;
}
}
}
while(R.size() >= L.size() + 2){
ll v = *R.begin();
R.erase(R.find(v));
add(v, -1);
M.insert(v);
while(true){
ll mn = *M.begin();
ll mx = *M.rbegin();
if(mx - mn > d){
L.insert(mn);
M.erase(M.find(mn));
add(mn, 1);
}else{
break;
}
}
}
};
ll ans = 1ll << 60;
for(int i = 0; i < n; i++){
M.insert(a[i]);
if(i >= k){
if(L.find(a[i - k]) != L.end()){
L.erase(L.find(a[i - k]));
add(a[i - k], -1);
}else if(M.find(a[i - k]) != M.end()){
M.erase(M.find(a[i - k]));
}else{
R.erase(R.find(a[i - k]));
add(a[i - k], -1);
}
}
update();
if(i >= k - 1){
ll mn = *M.begin();
ll mx = max(*M.rbegin(), mn + d);
int lp = lower_bound(c.begin(), c.end(), mn) - c.begin();
int rp = lower_bound(c.begin(), c.end(), mx) - c.begin();
ans = min(ans, mn * fw1.sum(0, lp) - fw2.sum(0, lp) + fw2.sum(rp, n) - fw1.sum(rp, n) * mx);
mx = *M.rbegin();
mn = mx - d;
lp = lower_bound(c.begin(), c.end(), mn) - c.begin();
rp = lower_bound(c.begin(), c.end(), mx) - c.begin();
ans = min(ans, mn * fw1.sum(0, lp) - fw2.sum(0, lp) + fw2.sum(rp, n) - fw1.sum(rp, n) * mx);
}
}
cout << ans << '\n';
}