結果
| 問題 | No.738 平らな農地 |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2026-02-19 21:23:29 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 64 ms / 2,000 ms |
| コード長 | 1,783 bytes |
| 記録 | |
| コンパイル時間 | 1,508 ms |
| コンパイル使用メモリ | 218,988 KB |
| 実行使用メモリ | 10,264 KB |
| 最終ジャッジ日時 | 2026-02-19 21:24:01 |
| 合計ジャッジ時間 | 7,534 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 87 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
const int inf = 1e18;
const int N = 5e5 + 7;
int n, k, a[N], res;
int val1 = 0, val2 = 0;
multiset<int> q1, q2;
inline void add(int x)
{
if (q2.size() == 0)
q1.insert(x), val1 += x;
else
{
int tmp = *q2.begin();
if (x >= tmp)
q2.insert(x), val2 += x;
else
q1.insert(x), val1 += x;
}
while (q1.size() > q2.size() + 1)
{
auto it = prev(q1.end());
int tmp = *it;
q1.erase(it), q2.insert(tmp);
val1 -= tmp, val2 += tmp;
}
while (q1.size() < q2.size())
{
auto it = q2.begin();
int tmp = *it;
q2.erase(it), q1.insert(tmp);
val2 -= tmp, val1 += tmp;
}
}
inline void del(int x)
{
if (q2.find(x) != q2.end())
q2.erase(q2.find(x)), val2 -= x;
else
q1.erase(q1.find(x)), val1 -= x;
while (q1.size() > q2.size() + 1)
{
auto it = prev(q1.end());
int tmp = *it;
q1.erase(it), q2.insert(tmp);
val1 -= tmp, val2 += tmp;
}
while (q1.size() < q2.size())
{
auto it = q2.begin();
int tmp = *it;
q2.erase(it), q1.insert(tmp);
val2 -= tmp, val1 += tmp;
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= k; i++)
add(a[i]);
int val = *(q1.rbegin());
res = val2 - val1 + (q1.size() - q2.size()) * val;
for (int i = k + 1; i <= n; i++)
{
del(a[i - k]), add(a[i]);
val = *(q1.rbegin());
res = min(res, ll(val2 - val1 + (q1.size() - q2.size()) * val));
}
cout << res;
}
vjudge1