제출 #749751

#제출 시각아이디문제언어결과실행 시간메모리
749751MilosMilutinovic수천개의 섬 (IOI22_islands)C++17
10 / 100
42 ms10112 KiB
#include "islands.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
vector < pair <int, int> > g[N];
vector < pair <int, int> > G[N];
int conn[500][500];
pair <int, int> go_up[N];
bool was[N];
vector <int> cyc;
void dfs_cyc(int x, int fa) {
    if (!cyc.empty()) return;
    was[x] = true;
    for (auto& p : G[x]) {
        int y = p.first;
        int id = p.second;
        if (id == fa) continue;
        if (y == 1) {
            int ver = x;
            while (ver != 1) {
                cyc.push_back(go_up[ver].second);
                ver = go_up[ver].first;
            }
            reverse(cyc.begin(), cyc.end());
            cyc.push_back(id);
            return;
        }
        if (was[y]) continue;
        go_up[y] = {x, id};
        dfs_cyc(y, id);
        if (!cyc.empty()) return;
    }
}
variant<bool, vector<int>> find_journey(int N, int M, vector<int> U, vector<int> V) {

    for (int i = 0; i < M; i++) {
        g[U[i]].emplace_back(V[i], i);
    }

    if (N == 2) {
        if (g[0].size() >= 2 && g[1].size() >= 1) {
            vector <int> ans;
            ans.push_back(g[0][0].second);
            ans.push_back(g[1][0].second);
            ans.push_back(g[0][1].second);
            ans.push_back(g[0][0].second);
            ans.push_back(g[1][0].second);
            ans.push_back(g[0][1].second);
            return ans;
        } else return false;
    }

    if (N <= 400) {
        for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++)
                conn[i][j] = -1;
        for (int i = 0; i < M; i++)
            conn[U[i]][V[i]] = i;
        bool sub2 = true;
        for (int i = 0; i < 3; i++)
            for (int j = 0; j < 3; j++)
                if (i != j && conn[i][j] == -1)
                    sub2 = false;
        if (sub2) {
            vector <int> ans;

            ans.push_back(conn[0][1]);
            ans.push_back(conn[1][2]);
            ans.push_back(conn[2][0]);

            ans.push_back(conn[0][2]);
            ans.push_back(conn[2][1]);
            ans.push_back(conn[1][0]);

            ans.push_back(conn[2][0]);
            ans.push_back(conn[1][2]);
            ans.push_back(conn[0][1]);

            ans.push_back(conn[1][0]);
            ans.push_back(conn[2][1]);
            ans.push_back(conn[0][2]);

            return ans;
        }
    }

    bool sub3 = (M % 2 == 0);
    for (int i = 0; i < M - 1; i += 2)
        sub3 = (sub3 & (U[i] == V[i + 1]) & (V[i] == U[i + 1]));

    if (sub3) {
        for (int i = 0; i < M; i += 2) {
            G[U[i]].emplace_back(V[i], i / 2);
            G[V[i]].emplace_back(U[i], i / 2);
        }
        dfs_cyc(1, 1);
        if (cyc.empty()) return false;
        else return true;
    }

    return false;

    if (N == 4) {
        return vector<int>({0, 1, 2, 4, 0, 3, 2, 1, 4, 3});
    }
    return false;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...