提出 #73741401
ソースコード 拡げる
#include <bits/stdc++.h>
using namespace std;
struct RobotPlan {
int si, sj;
char dir;
vector<char> cmd;
};
static constexpr int di[4] = {-1, 0, 1, 0};
static constexpr int dj[4] = {0, 1, 0, -1};
int main() {
if (fopen("./inC/0000.txt", "r") != nullptr) {
freopen("./inC/0004.txt", "r", stdin);
freopen("./output.txt", "w", stdout);
}
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, AK, AM, AW;
cin >> N >> AK >> AM >> AW;
vector<string> v(N), h(N - 1);
for (auto &s : v) cin >> s;
for (auto &s : h) cin >> s;
auto inside = [&](int x, int y) { return 0 <= x && x < N && 0 <= y && y < N; };
auto passable = [&](int x, int y, int nd) {
int nx = x + di[nd], ny = y + dj[nd];
if (!inside(nx, ny)) return false;
if (nd == 0) return h[x - 1][y] == '0';
if (nd == 1) return v[x][y] == '0';
if (nd == 2) return h[x][y] == '0';
return v[x][y - 1] == '0';
};
auto cell_id = [&](int x, int y) { return x * N + y; };
auto build_plan = [&](const vector<pair<int,int>> &roots, int node_cap) {
vector<int> used(N * N, 0);
vector<RobotPlan> plans;
for (auto [si, sj] : roots) {
if (used[cell_id(si, sj)]) continue;
vector<pair<int,int>> nodes;
queue<pair<int,int>> q;
q.push({si, sj});
used[cell_id(si, sj)] = 2; // queued
while (!q.empty() && (int)nodes.size() < node_cap) {
auto [x, y] = q.front(); q.pop();
nodes.push_back({x, y});
for (int d = 0; d < 4; ++d) {
if (!passable(x, y, d)) continue;
int nx = x + di[d], ny = y + dj[d], nid = cell_id(nx, ny);
if (used[nid] == 0) {
used[nid] = 2;
q.push({nx, ny});
}
}
}
vector<int> in_nodes(N * N, 0), par(N * N, -1);
for (auto [x, y] : nodes) in_nodes[cell_id(x, y)] = 1;
stack<pair<int,int>> st;
st.push({si, sj});
par[cell_id(si, sj)] = cell_id(si, sj);
vector<pair<int,int>> ord;
while (!st.empty()) {
auto [x, y] = st.top(); st.pop();
ord.push_back({x, y});
for (int d = 3; d >= 0; --d) {
if (!passable(x, y, d)) continue;
int nx = x + di[d], ny = y + dj[d], nid = cell_id(nx, ny);
if (!in_nodes[nid] || par[nid] != -1) continue;
par[nid] = cell_id(x, y);
st.push({nx, ny});
}
}
vector<vector<pair<int,int>>> ch(N * N);
for (auto [x, y] : ord) {
int u = cell_id(x, y);
if (u == par[u]) continue;
ch[par[u]].push_back({x, y});
}
vector<pair<int,int>> walk;
function<void(int,int)> dfs = [&](int x, int y) {
walk.push_back({x, y});
for (auto [nx, ny] : ch[cell_id(x, y)]) {
dfs(nx, ny);
walk.push_back({x, y});
}
};
dfs(si, sj);
if (walk.empty()) continue;
int curd = 0;
vector<char> cmd;
auto wdir = [&](int x1,int y1,int x2,int y2){
if (x2 == x1 - 1) return 0;
if (y2 == y1 + 1) return 1;
if (x2 == x1 + 1) return 2;
return 3;
};
for (int i = 0; i + 1 < (int)walk.size(); ++i) {
auto [x1, y1] = walk[i];
auto [x2, y2] = walk[i + 1];
int nd = wdir(x1, y1, x2, y2);
int diff = (nd - curd + 4) % 4;
if (diff == 1) cmd.push_back('R');
else if (diff == 2) cmd.push_back('R'), cmd.push_back('R');
else if (diff == 3) cmd.push_back('L');
cmd.push_back('F');
curd = nd;
}
int back = (0 - curd + 4) % 4;
if (back == 1) cmd.push_back('R');
else if (back == 2) cmd.push_back('R'), cmd.push_back('R');
else if (back == 3) cmd.push_back('L');
if (cmd.empty()) cmd.push_back('R');
if ((int)cmd.size() > 1600) continue;
for (auto [x, y] : walk) used[cell_id(x, y)] = 1;
plans.push_back({si, sj, 'U', cmd});
}
// 处理遗漏格子(理论上较少):用静态机器人补齐可行性。
for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) {
if (used[cell_id(i, j)] != 1) plans.push_back({i, j, 'U', {'R'}});
}
return plans;
};
// 子问题 C:K 和 W 很贵,优先少机器人 + 多状态。
// 先尝试 1 机器人;若超状态限制则退化到 2~3 机器人分块。
vector<RobotPlan> plans = build_plan({{0, 0}}, 400);
int heavy = 0;
for (auto &p : plans) if ((int)p.cmd.size() > 1) ++heavy;
if ((int)plans.size() > 1 || heavy == 0) {
plans = build_plan({{0, 0}, {N - 1, N - 1}}, 230);
if ((int)plans.size() > 3) {
plans = build_plan({{0, 0}, {0, N - 1}, {N - 1, 0}}, 170);
}
}
cout << plans.size() << '\n';
for (auto &p : plans) {
int m = (int)p.cmd.size();
cout << m << ' ' << p.si << ' ' << p.sj << ' ' << p.dir << '\n';
for (int s = 0; s < m; ++s) {
char a0 = p.cmd[s];
int b0 = (s + 1) % m;
char a1 = (a0 == 'F' ? 'R' : a0);
int b1 = (s + 1) % m;
cout << a0 << ' ' << b0 << ' ' << a1 << ' ' << b1 << '\n';
}
}
for (int i = 0; i < N; ++i) cout << string(N - 1, '0') << '\n';
for (int i = 0; i < N - 1; ++i) cout << string(N, '0') << '\n';
return 0;
}
提出情報
| 提出日時 | |
|---|---|
| 問題 | C - Periodic Patrol Automata (C) |
| ユーザ | lixiaoju |
| 言語 | C++23 (GCC 15.2.0) |
| 得点 | 1205303987 |
| コード長 | 6116 Byte |
| 結果 | AC |
| 実行時間 | 2 ms |
| メモリ | 3808 KiB |
ジャッジ結果
| セット名 | test_ALL | ||
|---|---|---|---|
| 得点 / 配点 | 1205303987 / 15000000000 | ||
| 結果 |
|
| セット名 | テストケース |
|---|---|
| test_ALL | test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt, test_0050.txt, test_0051.txt, test_0052.txt, test_0053.txt, test_0054.txt, test_0055.txt, test_0056.txt, test_0057.txt, test_0058.txt, test_0059.txt, test_0060.txt, test_0061.txt, test_0062.txt, test_0063.txt, test_0064.txt, test_0065.txt, test_0066.txt, test_0067.txt, test_0068.txt, test_0069.txt, test_0070.txt, test_0071.txt, test_0072.txt, test_0073.txt, test_0074.txt, test_0075.txt, test_0076.txt, test_0077.txt, test_0078.txt, test_0079.txt, test_0080.txt, test_0081.txt, test_0082.txt, test_0083.txt, test_0084.txt, test_0085.txt, test_0086.txt, test_0087.txt, test_0088.txt, test_0089.txt, test_0090.txt, test_0091.txt, test_0092.txt, test_0093.txt, test_0094.txt, test_0095.txt, test_0096.txt, test_0097.txt, test_0098.txt, test_0099.txt, test_0100.txt, test_0101.txt, test_0102.txt, test_0103.txt, test_0104.txt, test_0105.txt, test_0106.txt, test_0107.txt, test_0108.txt, test_0109.txt, test_0110.txt, test_0111.txt, test_0112.txt, test_0113.txt, test_0114.txt, test_0115.txt, test_0116.txt, test_0117.txt, test_0118.txt, test_0119.txt, test_0120.txt, test_0121.txt, test_0122.txt, test_0123.txt, test_0124.txt, test_0125.txt, test_0126.txt, test_0127.txt, test_0128.txt, test_0129.txt, test_0130.txt, test_0131.txt, test_0132.txt, test_0133.txt, test_0134.txt, test_0135.txt, test_0136.txt, test_0137.txt, test_0138.txt, test_0139.txt, test_0140.txt, test_0141.txt, test_0142.txt, test_0143.txt, test_0144.txt, test_0145.txt, test_0146.txt, test_0147.txt, test_0148.txt, test_0149.txt |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| test_0000.txt | AC | 1 ms | 3684 KiB |
| test_0001.txt | AC | 1 ms | 3744 KiB |
| test_0002.txt | AC | 1 ms | 3656 KiB |
| test_0003.txt | AC | 1 ms | 3640 KiB |
| test_0004.txt | AC | 1 ms | 3808 KiB |
| test_0005.txt | AC | 1 ms | 3708 KiB |
| test_0006.txt | AC | 2 ms | 3556 KiB |
| test_0007.txt | AC | 1 ms | 3584 KiB |
| test_0008.txt | AC | 1 ms | 3640 KiB |
| test_0009.txt | AC | 1 ms | 3544 KiB |
| test_0010.txt | AC | 1 ms | 3612 KiB |
| test_0011.txt | AC | 1 ms | 3712 KiB |
| test_0012.txt | AC | 1 ms | 3784 KiB |
| test_0013.txt | AC | 1 ms | 3556 KiB |
| test_0014.txt | AC | 1 ms | 3744 KiB |
| test_0015.txt | AC | 1 ms | 3640 KiB |
| test_0016.txt | AC | 1 ms | 3696 KiB |
| test_0017.txt | AC | 1 ms | 3708 KiB |
| test_0018.txt | AC | 1 ms | 3544 KiB |
| test_0019.txt | AC | 1 ms | 3640 KiB |
| test_0020.txt | AC | 1 ms | 3640 KiB |
| test_0021.txt | AC | 1 ms | 3744 KiB |
| test_0022.txt | AC | 1 ms | 3744 KiB |
| test_0023.txt | AC | 1 ms | 3784 KiB |
| test_0024.txt | AC | 1 ms | 3668 KiB |
| test_0025.txt | AC | 1 ms | 3708 KiB |
| test_0026.txt | AC | 1 ms | 3808 KiB |
| test_0027.txt | AC | 1 ms | 3784 KiB |
| test_0028.txt | AC | 1 ms | 3784 KiB |
| test_0029.txt | AC | 1 ms | 3556 KiB |
| test_0030.txt | AC | 1 ms | 3696 KiB |
| test_0031.txt | AC | 1 ms | 3544 KiB |
| test_0032.txt | AC | 1 ms | 3712 KiB |
| test_0033.txt | AC | 1 ms | 3712 KiB |
| test_0034.txt | AC | 1 ms | 3556 KiB |
| test_0035.txt | AC | 1 ms | 3544 KiB |
| test_0036.txt | AC | 1 ms | 3544 KiB |
| test_0037.txt | AC | 1 ms | 3668 KiB |
| test_0038.txt | AC | 1 ms | 3696 KiB |
| test_0039.txt | AC | 1 ms | 3744 KiB |
| test_0040.txt | AC | 1 ms | 3544 KiB |
| test_0041.txt | AC | 1 ms | 3712 KiB |
| test_0042.txt | AC | 1 ms | 3708 KiB |
| test_0043.txt | AC | 1 ms | 3708 KiB |
| test_0044.txt | AC | 1 ms | 3712 KiB |
| test_0045.txt | AC | 1 ms | 3692 KiB |
| test_0046.txt | AC | 1 ms | 3680 KiB |
| test_0047.txt | AC | 1 ms | 3712 KiB |
| test_0048.txt | AC | 1 ms | 3556 KiB |
| test_0049.txt | AC | 1 ms | 3808 KiB |
| test_0050.txt | AC | 1 ms | 3744 KiB |
| test_0051.txt | AC | 1 ms | 3744 KiB |
| test_0052.txt | AC | 2 ms | 3696 KiB |
| test_0053.txt | AC | 1 ms | 3708 KiB |
| test_0054.txt | AC | 1 ms | 3680 KiB |
| test_0055.txt | AC | 2 ms | 3712 KiB |
| test_0056.txt | AC | 1 ms | 3744 KiB |
| test_0057.txt | AC | 1 ms | 3708 KiB |
| test_0058.txt | AC | 1 ms | 3744 KiB |
| test_0059.txt | AC | 1 ms | 3704 KiB |
| test_0060.txt | AC | 1 ms | 3556 KiB |
| test_0061.txt | AC | 1 ms | 3784 KiB |
| test_0062.txt | AC | 1 ms | 3744 KiB |
| test_0063.txt | AC | 1 ms | 3692 KiB |
| test_0064.txt | AC | 1 ms | 3668 KiB |
| test_0065.txt | AC | 1 ms | 3784 KiB |
| test_0066.txt | AC | 1 ms | 3704 KiB |
| test_0067.txt | AC | 1 ms | 3784 KiB |
| test_0068.txt | AC | 1 ms | 3744 KiB |
| test_0069.txt | AC | 1 ms | 3696 KiB |
| test_0070.txt | AC | 1 ms | 3704 KiB |
| test_0071.txt | AC | 1 ms | 3784 KiB |
| test_0072.txt | AC | 1 ms | 3640 KiB |
| test_0073.txt | AC | 1 ms | 3784 KiB |
| test_0074.txt | AC | 1 ms | 3712 KiB |
| test_0075.txt | AC | 1 ms | 3712 KiB |
| test_0076.txt | AC | 1 ms | 3808 KiB |
| test_0077.txt | AC | 1 ms | 3556 KiB |
| test_0078.txt | AC | 2 ms | 3784 KiB |
| test_0079.txt | AC | 1 ms | 3784 KiB |
| test_0080.txt | AC | 1 ms | 3624 KiB |
| test_0081.txt | AC | 1 ms | 3692 KiB |
| test_0082.txt | AC | 1 ms | 3808 KiB |
| test_0083.txt | AC | 1 ms | 3756 KiB |
| test_0084.txt | AC | 1 ms | 3748 KiB |
| test_0085.txt | AC | 1 ms | 3692 KiB |
| test_0086.txt | AC | 1 ms | 3556 KiB |
| test_0087.txt | AC | 1 ms | 3704 KiB |
| test_0088.txt | AC | 2 ms | 3668 KiB |
| test_0089.txt | AC | 1 ms | 3556 KiB |
| test_0090.txt | AC | 1 ms | 3692 KiB |
| test_0091.txt | AC | 1 ms | 3708 KiB |
| test_0092.txt | AC | 1 ms | 3704 KiB |
| test_0093.txt | AC | 1 ms | 3708 KiB |
| test_0094.txt | AC | 1 ms | 3708 KiB |
| test_0095.txt | AC | 1 ms | 3708 KiB |
| test_0096.txt | AC | 1 ms | 3692 KiB |
| test_0097.txt | AC | 1 ms | 3696 KiB |
| test_0098.txt | AC | 1 ms | 3784 KiB |
| test_0099.txt | AC | 1 ms | 3692 KiB |
| test_0100.txt | AC | 1 ms | 3808 KiB |
| test_0101.txt | AC | 1 ms | 3744 KiB |
| test_0102.txt | AC | 1 ms | 3744 KiB |
| test_0103.txt | AC | 1 ms | 3744 KiB |
| test_0104.txt | AC | 2 ms | 3808 KiB |
| test_0105.txt | AC | 1 ms | 3744 KiB |
| test_0106.txt | AC | 1 ms | 3712 KiB |
| test_0107.txt | AC | 1 ms | 3692 KiB |
| test_0108.txt | AC | 1 ms | 3692 KiB |
| test_0109.txt | AC | 2 ms | 3744 KiB |
| test_0110.txt | AC | 1 ms | 3744 KiB |
| test_0111.txt | AC | 1 ms | 3668 KiB |
| test_0112.txt | AC | 1 ms | 3744 KiB |
| test_0113.txt | AC | 1 ms | 3744 KiB |
| test_0114.txt | AC | 1 ms | 3744 KiB |
| test_0115.txt | AC | 1 ms | 3744 KiB |
| test_0116.txt | AC | 1 ms | 3696 KiB |
| test_0117.txt | AC | 1 ms | 3640 KiB |
| test_0118.txt | AC | 1 ms | 3744 KiB |
| test_0119.txt | AC | 1 ms | 3704 KiB |
| test_0120.txt | AC | 1 ms | 3752 KiB |
| test_0121.txt | AC | 1 ms | 3544 KiB |
| test_0122.txt | AC | 1 ms | 3808 KiB |
| test_0123.txt | AC | 1 ms | 3736 KiB |
| test_0124.txt | AC | 1 ms | 3640 KiB |
| test_0125.txt | AC | 2 ms | 3696 KiB |
| test_0126.txt | AC | 1 ms | 3668 KiB |
| test_0127.txt | AC | 1 ms | 3708 KiB |
| test_0128.txt | AC | 1 ms | 3780 KiB |
| test_0129.txt | AC | 1 ms | 3784 KiB |
| test_0130.txt | AC | 1 ms | 3720 KiB |
| test_0131.txt | AC | 1 ms | 3556 KiB |
| test_0132.txt | AC | 1 ms | 3692 KiB |
| test_0133.txt | AC | 1 ms | 3744 KiB |
| test_0134.txt | AC | 1 ms | 3556 KiB |
| test_0135.txt | AC | 1 ms | 3712 KiB |
| test_0136.txt | AC | 1 ms | 3640 KiB |
| test_0137.txt | AC | 1 ms | 3744 KiB |
| test_0138.txt | AC | 1 ms | 3704 KiB |
| test_0139.txt | AC | 1 ms | 3744 KiB |
| test_0140.txt | AC | 1 ms | 3640 KiB |
| test_0141.txt | AC | 1 ms | 3756 KiB |
| test_0142.txt | AC | 1 ms | 3744 KiB |
| test_0143.txt | AC | 1 ms | 3788 KiB |
| test_0144.txt | AC | 1 ms | 3556 KiB |
| test_0145.txt | AC | 1 ms | 3640 KiB |
| test_0146.txt | AC | 1 ms | 3704 KiB |
| test_0147.txt | AC | 1 ms | 3808 KiB |
| test_0148.txt | AC | 1 ms | 3696 KiB |
| test_0149.txt | AC | 1 ms | 3668 KiB |