답안 #707906

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
707906 2023-03-10T12:26:31 Z Cyanmond 장난감 기차 (IOI17_train) C++17
22 / 100
989 ms 262144 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(pow3[n], std::vector<bool>(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 (a[f] == 1) {
                    bool isOk = false;
                    for (const int t : graph[f]) {
                        if (status[t] == 0) {
                            isOk |= dp[nextBits(t)][t];
                        } else if (status[t] == 2) {
                            isOk = true;
                        }
                    }
                    dp[bits][f] = isOk;
                } else {
                    bool isOk = true;
                    for (const int t : graph[f]) {
                        if (status[t] == 0) {
                            if (not dp[nextBits(t)][t]) {
                                isOk = false;
                            }
                        } else if (status[t] == 1) {
                            isOk = false;
                        }
                    }
                    dp[bits][f] = isOk;
                }
            }
        }
        std::vector<int> answer(n);
        for (int i = 0; i < n; ++i) {
            answer[i] = dp[pow3[i] * (r[i] + 1)][i] ? 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);
      |                                          ^
# 결과 실행 시간 메모리 Grader output
1 Runtime error 5 ms 1236 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 301 ms 262144 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 253 ms 4308 KB Output is correct
2 Correct 261 ms 4532 KB Output is correct
3 Correct 277 ms 4660 KB Output is correct
4 Correct 989 ms 4524 KB Output is correct
5 Correct 672 ms 4504 KB Output is correct
6 Correct 572 ms 4464 KB Output is correct
7 Correct 762 ms 4440 KB Output is correct
8 Correct 377 ms 4568 KB Output is correct
9 Correct 359 ms 4540 KB Output is correct
10 Correct 460 ms 4436 KB Output is correct
11 Correct 380 ms 4404 KB Output is correct
12 Correct 48 ms 4412 KB Output is correct
13 Correct 851 ms 4564 KB Output is correct
14 Correct 849 ms 4564 KB Output is correct
15 Correct 829 ms 4664 KB Output is correct
16 Correct 844 ms 4564 KB Output is correct
17 Correct 829 ms 4544 KB Output is correct
18 Correct 474 ms 4244 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 747 ms 4180 KB Output is correct
2 Correct 274 ms 4180 KB Output is correct
3 Correct 373 ms 4300 KB Output is correct
4 Correct 566 ms 4308 KB Output is correct
5 Correct 650 ms 4236 KB Output is correct
6 Correct 618 ms 4240 KB Output is correct
7 Correct 675 ms 4352 KB Output is correct
8 Correct 410 ms 4320 KB Output is correct
9 Correct 59 ms 4184 KB Output is correct
10 Correct 820 ms 4308 KB Output is correct
11 Correct 826 ms 4308 KB Output is correct
12 Correct 846 ms 4300 KB Output is correct
13 Correct 613 ms 4244 KB Output is correct
14 Correct 425 ms 4320 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 8 ms 1876 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 5 ms 1236 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -