結果
| 問題 |
No.738 平らな農地
|
| ユーザー |
|
| 提出日時 | 2019-05-15 19:20:15 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 3,631 bytes |
| コンパイル時間 | 2,044 ms |
| コンパイル使用メモリ | 181,460 KB |
| 実行使用メモリ | 9,088 KB |
| 最終ジャッジ日時 | 2024-09-14 08:03:50 |
| 合計ジャッジ時間 | 10,957 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 63 WA * 2 RE * 22 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
long long solve_odd(int N, int K, const vector<long long> & As){
int w = K / 2;
vector<long long> Bs(As.begin(), As.begin() + K);
sort(Bs.begin(), Bs.end());
long long med = Bs[w];
multiset<long long> Ls(Bs.begin(), Bs.begin() + w);
multiset<long long> Rs(Bs.begin() + w + 1, Bs.end());
long long cost = 0;
for (auto b : Bs) cost += abs(b - med);
long long best = cost;
for (int i = K; i < N; ++i){
long long vin = As[i];
long long vout = As[i - K];
if (med < vin and med < vout){
Rs.insert(vin);
auto it = Rs.find(vout);
Rs.erase(it);
cost += vin - vout;
}else if (vin <= med and vout <= med){
Ls.insert(vin);
auto it = Ls.find(vout);
Ls.erase(it);
cost += vout - vin;
}else if (vin <= med and med < vout){
Rs.insert(med);
auto it = Rs.find(vout);
Rs.erase(it);
cost += med - vout;
med = *Ls.rbegin();
Ls.insert(vin);
it = Ls.find(med);
Ls.erase(it);
cost += med - vin;
}else if (med < vin and vout <= med){
Ls.insert(med);
auto it = Ls.find(vout);
Ls.erase(it);
cost += vout - med;
med = *Rs.begin();
Rs.insert(vin);
it = Rs.find(med);
Rs.erase(it);
cost += vin - med;
}
best = min(best, cost);
}
return best;
}
long long solve_even(int N, int K, const vector<long long> & As){
int w = K / 2;
vector<long long> Bs(As.begin(), As.begin() + K);
sort(Bs.begin(), Bs.end());
long long medL = Bs[w - 1];
long long medR = Bs[w];
long long med = (medL + medR) / 2LL;
multiset<long long> Ls(Bs.begin(), Bs.begin() + w);
multiset<long long> Rs(Bs.begin() + w, Bs.end());
long long cost = 0;
for (auto b : Bs) cost += abs(b - med);
long long best = cost;
for (int i = K; i < N; ++i){
long long vin = As[i];
long long vout = As[i - K];
if (medL < vin and medR <= vout){
Rs.insert(vin);
auto it = Rs.find(vout);
Rs.erase(it);
cost += vin - vout;
}else if (vin <= medR and vout <= medL){
Ls.insert(vin);
auto it = Ls.find(vout);
assert(it != Ls.end());
Ls.erase(it);
cost += vout - vin;
}else if (vin <= medR and medR <= vout){
Rs.insert(medL);
auto it = Rs.find(vout);
Rs.erase(it);
cost += medL - vout;
Ls.insert(vin);
it = Ls.find(medL);
Ls.erase(it);
cost += medL - vin;
}else if (medL < vin and vout <= medL){
Ls.insert(medR);
auto it = Ls.find(vout);
Ls.erase(it);
cost += vout - medR;
Rs.insert(vin);
it = Rs.find(medR);
Rs.erase(it);
cost += vin - medR;
}
best = min(best, cost);
medL = *Ls.rbegin();
medR = *Rs.begin();
}
return best;
}
long long solve(int N, int K, const vector<long long> & As){
if (K % 2 == 1){
return solve_odd(N, K, As);
}else{
return solve_even(N, K, As);
}
}
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
int N, K;
cin >> N >> K;
vector<long long> As(N, 0);
for (auto & a : As) cin >> a;
cout << solve(N, K, As) << endl;
return 0;
}