結果
| 問題 |
No.1248 Kth Sum
|
| コンテスト | |
| ユーザー |
noshi91
|
| 提出日時 | 2020-10-02 22:54:25 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 109 ms / 2,000 ms |
| コード長 | 1,894 bytes |
| コンパイル時間 | 1,019 ms |
| コンパイル使用メモリ | 84,380 KB |
| 最終ジャッジ日時 | 2025-01-15 01:00:44 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 36 |
ソースコード
#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <iostream>
#include <limits>
#include <numeric>
#include <vector>
int main() {
using usize = std::size_t;
using u64 = std::uint64_t;
static constexpr u64 inf = std::numeric_limits<u64>::max();
usize n, k;
std::cin >> n >> k;
u64 ans = inf;
std::vector<u64> a(n);
for (auto &e : a) {
std::cin >> e;
}
std::vector<u64> pmin(n), smin(n);
pmin[k - 1] = a[k - 1];
for (usize i = k; i != n; ++i) {
pmin[i] = std::min(pmin[i - 1], a[i]);
}
smin[n - 1] = a[n - 1];
for (usize i = n; i != k;) {
i -= 1;
smin[i - 1] = std::min(smin[i], a[i - 1]);
}
std::vector<usize> b(n - (k - 1));
std::iota(b.begin(), b.end(), k - 1);
std::sort(b.begin(), b.end(), [&](usize l, usize r) { return a[l] < a[r]; });
std::vector<usize> bmi = b, bma = b;
bmi.insert(bmi.begin(), n);
bma.insert(bma.begin(), 0);
for (usize i = 0; i != b.size(); ++i) {
bmi[i + 1] = std::min(bmi[i], b[i]);
bma[i + 1] = std::max(bma[i], b[i]);
}
u64 sum = 0;
for (usize i = 1; i * k <= n; ++i) {
sum += a[b[i - 1]];
if (i == 1) {
ans = std::min(ans, a[k - 1]);
continue;
}
if (bmi[i] <= (k - 1) * i) {
if (bma[i] >= k * i - 1) {
ans = std::min(ans, sum);
} else {
u64 t = a[b[i - 1]];
if (bmi[i - 1] > (k - 1) * i) {
t = a[b[i - 2]];
}
ans = std::min(ans, sum - t + smin[k * i - 1]);
}
} else {
if (bma[i] >= k * i - 1) {
u64 t = a[b[i - 1]];
if (bma[i - 1] < k * i - 1) {
t = a[b[i - 2]];
}
ans = std::min(ans, sum - t + pmin[(k - 1) * i]);
} else {
u64 t = a[b[i - 1]] + a[b[i - 2]];
ans = std::min(ans, sum - t + pmin[(k - 1) * i] + smin[k * i - 1]);
}
}
}
std::cout << ans << "\n";
return 0;
}
noshi91