結果
問題 |
No.1613 Rush and Remove
|
ユーザー |
![]() |
提出日時 | 2025-05-14 13:20:25 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
MLE
|
実行時間 | - |
コード長 | 3,715 bytes |
コンパイル時間 | 1,133 ms |
コンパイル使用メモリ | 97,500 KB |
実行使用メモリ | 814,464 KB |
最終ジャッジ日時 | 2025-05-14 13:22:01 |
合計ジャッジ時間 | 4,045 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 4 |
other | AC * 4 MLE * 1 -- * 31 |
ソースコード
#include <iostream> #include <vector> #include <string> #include <set> #include <map> #include <numeric> #include <algorithm> // Mask type for column configuration. std::vector<bool> is specialized // and works as a key in std::map. using Mask = std::vector<bool>; // Memoization table for Grundy values of column states. std::map<Mask, int> memo; // Global H to be accessible in the recursive function easily. int H_global; // Calculates Grundy value for a given column configuration. int calculate_grundy_for_column(const Mask& current_mask) { // Check if already computed. if (memo.count(current_mask)) { return memo[current_mask]; } // Base case: if the column is empty, Grundy value is 0. // Check if all elements are false. bool all_empty = true; for (int i = 0; i < H_global; ++i) { if (current_mask[i]) { all_empty = false; break; } } if (all_empty) { return memo[current_mask] = 0; } std::set<int> reachable_grundy_values; // Iterate over each possible piece to select. // r_idx is the 0-indexed row of the piece. for (int r_idx = 0; r_idx < H_global; ++r_idx) { if (!current_mask[r_idx]) { continue; // No piece at this row. } // Piece at r_idx (0-indexed) selected. This corresponds to problem's i = r_idx + 1. // Choose i* (1-indexed) from 1 to i (i.e., r_idx + 1). // Convert i* to 0-indexed new_top_r_idx = i* - 1. // So, new_top_r_idx ranges from 0 to r_idx. for (int new_top_r_idx = 0; new_top_r_idx <= r_idx; ++new_top_r_idx) { // Cells for new pieces are new_top_r_idx to r_idx-1 (0-indexed). // These must be empty. bool placement_possible = true; for (int k = new_top_r_idx; k < r_idx; ++k) { if (current_mask[k]) { placement_possible = false; break; } } if (!placement_possible) { continue; } // If placement is possible, construct the next state. Mask next_mask = current_mask; next_mask[r_idx] = false; // Remove piece from r_idx. // Place new pieces. for (int k = new_top_r_idx; k < r_idx; ++k) { next_mask[k] = true; } // Recursively find Grundy value of the next state and add to set. reachable_grundy_values.insert(calculate_grundy_for_column(next_mask)); } } // Calculate Mex of the set of reachable Grundy values. int mex = 0; while (reachable_grundy_values.count(mex)) { mex++; } return memo[current_mask] = mex; } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int H, W; std::cin >> H >> W; H_global = H; // Set global H std::vector<std::string> board_str(H); for (int i = 0; i < H; ++i) { std::cin >> board_str[i]; } int total_nim_sum = 0; for (int j = 0; j < W; ++j) { // Iterate over each column Mask column_mask(H); // Populate mask for current column for (int i = 0; i < H; ++i) { if (board_str[i][j] == 'o') { column_mask[i] = true; } else { column_mask[i] = false; } } // Calculate Grundy value for this column and XOR with total. total_nim_sum ^= calculate_grundy_for_column(column_mask); } if (total_nim_sum != 0) { std::cout << "First" << std::endl; } else { std::cout << "Second" << std::endl; } return 0; }