結果
| 問題 | No.5025 Forest Fire |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-10-24 17:03:54 |
| 言語 | C++23 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 2 ms / 2,000 ms |
| + 563µs | |
| コード長 | 1,865 bytes |
| 記録 | |
| コンパイル時間 | 1,441 ms |
| コンパイル使用メモリ | 190,252 KB |
| 実行使用メモリ | 9,932 KB |
| スコア | 155,234,569 |
| 最終ジャッジ日時 | 2026-10-24 17:04:57 |
| 合計ジャッジ時間 | 59,143 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / <nil> |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 50 |
ソースコード
#include <cmath>
#include <iostream>
#include <utility>
#include <vector>
struct Input {
int N = 0;
int K = 0;
std::vector<std::vector<int>> d;
};
struct Output {
std::vector<std::pair<int, int>> cut_trees;
};
Input read_input(std::istream& in = std::cin) {
Input input;
in >> input.N >> input.K;
input.d.assign(input.N, std::vector<int>(input.N));
for (int i = 0; i < input.N; ++i) {
for (int j = 0; j < input.N; ++j) {
// 乾燥度は1桁なので、連続した数字と空白区切りの両方を読める。
char digit;
in >> digit;
input.d[i][j] = digit - '0';
}
}
return input;
}
void print_output(const Output& output, std::ostream& out = std::cout) {
out << output.cut_trees.size() << '\n';
for (const auto& [i, j] : output.cut_trees) {
out << i << ' ' << j << '\n';
}
}
Output solve(const Input& input) {
//対角線上に伐採する。水のときは伐採しない。
Output output;
for (int i = 0; i < input.N; ++i) {
if (input.d[i][i] != 0) {
output.cut_trees.emplace_back(i, i);
}
}
//もう一本の対角線も伐採していない、水の無い場所を伐採する。
for (int i = 0; i < input.N; ++i) {
int j = input.N - 1 - i;
if (i != j && input.d[i][j] != 0) {
output.cut_trees.emplace_back(i, j);
}
}
return output;
}
// E0 と E は正の期待焼失本数。期待値自体の計算は行わない。
long long calc_score(double E0, double E) {
return std::llround(1'000'000.0 * (1.0 + std::log2(E0 / E)));
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
const Input input = read_input();
const Output output = solve(input);
print_output(output);
return 0;
}