結果
| 問題 | No.5024 魔法少女うなと宝集め |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-05-02 17:52:27 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 2,000 ms |
| コード長 | 2,497 bytes |
| 記録 | |
| コンパイル時間 | 6,190 ms |
| コンパイル使用メモリ | 397,832 KB |
| 実行使用メモリ | 6,400 KB |
| スコア | 1,688,622 |
| 最終ジャッジ日時 | 2026-05-02 17:53:02 |
| 合計ジャッジ時間 | 13,339 ms |
|
ジャッジサーバーID (参考情報) |
judge1_1 / judge3_0 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 50 |
ソースコード
#include <bits/extc++.h>
int main() {
using namespace std;
unsigned N, T;
cin >> N >> T;
vector A(N, vector<unsigned>(N));
for (auto&& row : A)
for (auto&& a : row)
cin >> a;
vector<vector<pair<unsigned, unsigned>>> idxs;
// 横
idxs.emplace_back();
idxs.back().emplace_back(0, 0);
for (unsigned i{}; i < N; i += 2) {
ranges::copy(views::iota(1U, N) | views::transform([i](const auto j){return make_pair(i, j);}), back_inserter(idxs.back()));
ranges::copy(views::iota(1U, N) | views::transform([i](const auto j){return make_pair(i + 1, j);}) | views::reverse, back_inserter(idxs.back()));
}
ranges::copy(views::iota(1U, N) | views::transform([](const auto i){return make_pair(i, 0);}) | views::reverse, back_inserter(idxs.back()));
// 縦
idxs.emplace_back();
idxs.back().emplace_back(0, 0);
for (unsigned i{}; i < N; i += 2) {
ranges::copy(views::iota(1U, N) | views::transform([i](const auto j){return make_pair(j, i);}), back_inserter(idxs.back()));
ranges::copy(views::iota(1U, N) | views::transform([i](const auto j){return make_pair(j, i + 1);}) | views::reverse, back_inserter(idxs.back()));
}
ranges::copy(views::iota(1U, N) | views::transform([](const auto i){return make_pair(0, i);}) | views::reverse, back_inserter(idxs.back()));
const auto solve{[N, &A](const auto seq, unsigned T) {
vector<unsigned> sum(N * N);
for (const auto& [i, x] : seq | views::enumerate)
sum[i] = A[x.first][x.second];
for (unsigned i{}; i < N * N; ++i)
sum.emplace_back(sum[i]);
inclusive_scan(begin(sum), end(sum), begin(sum));
sum.emplace(begin(sum));
unsigned ans{}, now_idx{};
for (unsigned i{}; i < N * N; ++i) {
const auto now{sum[i + T] - sum[i]};
if (now > ans) {
ans = now;
now_idx = i;
}
}
vector<pair<unsigned, unsigned>> ret;
ret.reserve(size(seq) * 2);
ranges::copy(seq, back_inserter(ret));
ranges::copy(seq, back_inserter(ret));
return make_pair(ans, ret | views::drop(now_idx) | views::take(T) | ranges::to<vector>());
}};
const auto [ans, seq]{ranges::max(idxs | views::transform([T, &solve](const auto& r){return solve(r, T);}))};
cout << size(seq) << endl;
for (const auto& [i, j] : seq)
cout << i << " " << j << endl;
return 0;
}