結果
問題 |
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; }