Submission #707909

# Submission time Handle Problem Language Result Execution time Memory
707909 2023-03-10T12:35:02 Z Cyanmond Toy Train (IOI17_train) C++17
22 / 100
2000 ms 28324 KB
#include "train.h"
#include <bits/stdc++.h>

using namespace std;

std::vector<int> who_wins(std::vector<int> a, std::vector<int> r, std::vector<int> u, std::vector<int> v) {
    const int n = (int)a.size(), m = (int)u.size();
    std::vector<std::vector<int>> graph(n);
    for (int i = 0; i < m; ++i) {
        graph[u[i]].push_back(v[i]);
    }
    int cntC = 0;
    int chargingS = -1;
    for (int i = 0; i < n; ++i) {
        if (r[i] == 1) {
            ++cntC;
            if (chargingS == -1) {
                chargingS = i;
            }
        }
    }/*
    if (cntC == 1) {
        // subtask 5
        std::vector<int> reachableV(n, -1);
        reachableV[chargingS] = 1;
        for (int i = 0; i < n; ++i) {
            auto itr = std::find(graph[i].begin(), graph[i].end(), i);
            if (r[i] == 0 and a[i] == 0 and itr != graph[i].end()) {
                reachableV[i] = 0;
            }
        }
        for (int x = 0; x < 2 * n; ++x) {
            for (int i = 0; i < n; ++i) {
                if (reachableV[i] != -1) {
                    continue;
                }
                if (a[i] == 1) {
                    bool isOk = false, isRa = true;
                    for (const int t : graph[i]) {
                        if (reachableV[t] == 1) {
                            isOk = true;
                        }
                        if (reachableV[t] == -1) {
                            isRa = false;
                        }
                    }
                    if (isOk) {
                        reachableV[i] = 1;
                    } else if (isRa) {
                        reachableV[i] = 0;
                    }
                } else {
                    bool isOk = true, isRa = true;
                    for (const int t : graph[i]) {
                        if (reachableV[t] != 1) {
                            isOk = false;
                        }
                        if (reachableV[t] == -1) {
                            isRa = false;
                        }
                    }
                    if (isOk) {
                        reachableV[i] = 1;
                    } else if (isRa) {
                        reachableV[i] = 0;
                    }
                }
            }
        }
        for (auto &e : reachableV) {
            if (e == -1) {
                e = 0;
            }
        }
        reachableV[chargingS] = -1;
        if (a[chargingS] == 1) {
            bool isOk = false;
            for (const int t : graph[chargingS]) {
                if (reachableV[t] == 1) {
                    isOk = true;
                } else if (t == chargingS) {
                    isOk = true;
                }
            }
            if (isOk) {
                reachableV[chargingS] = 1;
            } else {
                reachableV[chargingS] = 0;
            }
        } else {
            bool isOk = true;
            for (const int t : graph[chargingS]) {
                if (reachableV[t] == 0) {
                    isOk = false;
                }
            }
            if (isOk) {
                reachableV[chargingS] = 1;
            } else {
                reachableV[chargingS] = 0;
            }
        }
    
        std::vector<int> answer(n);
        for (int i = 0; i < n; ++i) {
            answer[i] = (reachableV[i] == 1 and reachableV[chargingS] == 1) ? 1 : 0;
        }
        return answer;
    } else */if (std::all_of(a.begin(), a.end(), [](const int v) {
        return v == 0;
    })) {
        // subtask 4
        std::vector<int> answer(n, 1);
        std::vector<bool> tCycle(n);
        for (int f = 0; f < n; ++f) {
            std::vector<int> type(n);
            auto dfs = [&](auto &&self, const int v) -> bool {
                type[v] = 1;
                for (const int t : graph[v]) {
                    if (r[t] == 1) {
                        continue;
                    }
                    if (type[t] == 0) {
                        const auto res = self(self, t);
                        if (res) {
                            return true;
                        }
                    } else if (type[t] == 1) {
                        return true;
                    }
                }
                type[v] = 2;
                return false;
            };
            tCycle[f] = dfs(dfs, f);
        }
        std::vector<std::vector<bool>> isReachable(n, std::vector<bool>(n));
        for (int f = 0; f < n; ++f) {
            isReachable[f][f] = true;
            std::queue<int> que;
            que.push(f);
            while (not que.empty()) {
                const int x = que.front();
                que.pop();
                for (const int t : graph[x]) {
                    if (not isReachable[f][t]) {
                        isReachable[f][t] = true;
                        que.push(t);
                    }
                }
            }
        }
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                if (isReachable[i][j] and tCycle[j]) {
                    answer[i] = 0;
                }
            }
        }
        return answer;
    } else if (std::all_of(a.begin(), a.end(), [](const int v) {
        return v == 1;
    })) {
        // subtask 3
        std::vector<int> answer(n);
        std::vector<bool> tCycle(n);
        for (int f = 0; f < n; ++f) {
            if (r[f] == 0) {
                continue;
            }
            std::vector<int> type(n);
            auto dfs = [&](auto &&self, const int v) -> bool {
                type[v] = 1;
                for (const int t : graph[v]) {
                    if (type[t] == 0) {
                        const auto res = self(self, t);
                        if (res) {
                            return true;
                        }
                    } else if (t == f) {
                        return true;
                    }
                }
                type[v] = 2;
                return false;
            };
            tCycle[f] = dfs(dfs, f);
        }
        std::vector<std::vector<bool>> isReachable(n, std::vector<bool>(n));
        for (int f = 0; f < n; ++f) {
            isReachable[f][f] = true;
            std::queue<int> que;
            que.push(f);
            while (not que.empty()) {
                const int x = que.front();
                que.pop();
                for (const int t : graph[x]) {
                    if (not isReachable[f][t]) {
                        isReachable[f][t] = true;
                        que.push(t);
                    }
                }
            }
        }
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                if (isReachable[i][j] and tCycle[j]) {
                    answer[i] = 1;
                }
            }
        }
        return answer;
    } else if (n <= 15) {
        // subtask 2
        std::vector<int> pow3(n + 1);
        pow3[0] = 1;
        for (int i = 1; i <= n; ++i) {
            pow3[i] = pow3[i - 1] * 3;
        }
        std::vector<std::vector<bool>> dp(n, std::vector<bool>(pow3[n]));
        for (int bits = pow3[n] - 1; bits >= 0; --bits) {
            std::vector<int> status(n);
            for (int i = 0; i < n; ++i) {
                const int v = bits % pow3[i + 1];
                const int c = v / pow3[i];
                status[i] = c;
            }
            auto nextBits = [&](const int a) {
                assert(status[a] == 0);
                int res = bits;
                res += pow3[a];
                if (r[a] == 1) {
                    for (int i = 0; i < n; ++i) {
                        const int v = res % pow3[i + 1];
                        const int c = v / pow3[i];
                        if (c == 1) {
                            res += pow3[i];
                        }
                    }
                }
                return res;
            };
            for (int f = 0; f < n; ++f) {
                if (status[f] == 0) {
                    continue;
                }
                if (a[f] == 1) {
                    bool isOk = false;
                    for (const int t : graph[f]) {
                        if (status[t] == 0) {
                            isOk |= dp[t][nextBits(t)];
                        } else if (status[t] == 2) {
                            isOk = true;
                        }
                    }
                    dp[f][bits] = isOk;
                } else {
                    bool isOk = true;
                    for (const int t : graph[f]) {
                        if (status[t] == 0) {
                            if (not dp[t][nextBits(t)]) {
                                isOk = false;
                            }
                        } else if (status[t] == 1) {
                            isOk = false;
                        }
                    }
                    dp[f][bits] = isOk;
                }
            }
        }
        std::vector<int> answer(n);
        for (int i = 0; i < n; ++i) {
            answer[i] = dp[i][pow3[i] * (r[i] + 1)] ? 1 : 0;
        }
        return answer;
    } else {
        // subtask 1
    }
}

Compilation message

train.cpp: In function 'std::vector<int> who_wins(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
train.cpp:8:42: warning: control reaches end of non-void function [-Wreturn-type]
    8 |     std::vector<std::vector<int>> graph(n);
      |                                          ^
# Verdict Execution time Memory Grader output
1 Runtime error 5 ms 1236 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 2058 ms 28324 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 268 ms 4308 KB Output is correct
2 Correct 283 ms 4324 KB Output is correct
3 Correct 279 ms 4448 KB Output is correct
4 Correct 982 ms 4336 KB Output is correct
5 Correct 697 ms 4436 KB Output is correct
6 Correct 617 ms 4260 KB Output is correct
7 Correct 801 ms 4232 KB Output is correct
8 Correct 365 ms 4308 KB Output is correct
9 Correct 367 ms 4308 KB Output is correct
10 Correct 421 ms 4308 KB Output is correct
11 Correct 392 ms 4308 KB Output is correct
12 Correct 55 ms 4308 KB Output is correct
13 Correct 875 ms 4472 KB Output is correct
14 Correct 832 ms 4436 KB Output is correct
15 Correct 849 ms 4436 KB Output is correct
16 Correct 828 ms 4308 KB Output is correct
17 Correct 839 ms 4308 KB Output is correct
18 Correct 474 ms 4128 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 739 ms 4180 KB Output is correct
2 Correct 268 ms 4172 KB Output is correct
3 Correct 383 ms 4264 KB Output is correct
4 Correct 550 ms 4308 KB Output is correct
5 Correct 655 ms 4240 KB Output is correct
6 Correct 656 ms 4236 KB Output is correct
7 Correct 673 ms 4216 KB Output is correct
8 Correct 397 ms 4320 KB Output is correct
9 Correct 56 ms 4308 KB Output is correct
10 Correct 826 ms 4308 KB Output is correct
11 Correct 827 ms 4308 KB Output is correct
12 Correct 868 ms 4308 KB Output is correct
13 Correct 580 ms 4300 KB Output is correct
14 Correct 398 ms 4304 KB Output is correct
# Verdict Execution time Memory Grader output
1 Runtime error 8 ms 1876 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 5 ms 1236 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -