結果
| 問題 | No.3740 Troublesome Congestion |
| コンテスト | |
| ユーザー |
👑 |
| 提出日時 | 2026-09-09 02:06:58 |
| 言語 | C++23 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 2 ms / 2,000 ms |
| + 68µs | |
| コード長 | 1,835 bytes |
| 記録 | |
| コンパイル時間 | 2,147 ms |
| コンパイル使用メモリ | 337,228 KB |
| 実行使用メモリ | 6,528 KB |
| 最終ジャッジ日時 | 2026-09-19 13:15:34 |
| 合計ジャッジ時間 | 4,452 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge4_1 |
(要ログイン)
| サブタスク | 配点 | 結果 |
|---|---|---|
| 部分点1 | 20 % | AC * 7 |
| 部分点2 | 30 % | AC * 12 |
| 満点 | 50 % | AC * 26 |
| 合計 | 4 * 100% = 400 点 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
vector<string> construct(int64 m) {
constexpr int N = 40;
vector<string> s(N, string(N, '#'));
// 中央の帯と、外側の2本の通路。
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
const int d = abs(i - j);
// 中央の帯は38×38で打ち切る。
if (i < 38 && j < 38 && d <= 2) {
s[i][j] = '.';
}
// 外側の階段状の通路。
if (4 <= d && d <= 5) {
s[i][j] = '.';
}
}
}
// 外側の通路をゴールにつなぐ。
for (int i = 34; i < N; ++i) {
s[i][39] = '.';
s[39][i] = '.';
}
// 3進法の下位36桁。
// 各kについて、重み3^kのスイッチ候補が2個ある。
for (int k = 0; k < 36; ++k) {
const int digit = int(m % 3);
m /= 3;
if (digit >= 1) s[k][k + 3] = 'P';
if (digit >= 2) s[k + 3][k] = 'P';
}
// ここでm = floor(元のM / 3^36) で、0 <= m <= 6。
// 末尾の4候補の重みは、それぞれ (2,2,1,1) * 3^36。
const tuple<int, int, int> tail[] = {
{37, 38, 2},
{38, 37, 2},
{36, 38, 1},
{38, 36, 1}
};
for (auto [r, c, weight] : tail) {
if (m >= weight) {
s[r][c] = 'P';
m -= weight;
}
}
assert(m == 0);
return s;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
if (!(cin >> T)) return 0;
while (T--) {
int64 M;
cin >> M;
const auto s = construct(M);
cout << s.size() << '\n';
for (const auto& row : s) {
cout << row << '\n';
}
}
return 0;
}