提出 #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
結果
AC × 150
セット名 テストケース
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