Submission #749755

#TimeUsernameProblemLanguageResultExecution timeMemory
749755MilosMilutinovicThousands Islands (IOI22_islands)C++17
10 / 100
38 ms10128 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;
bool found = false;
void dfs_cyc(int x, int fa) {
    if (found) return;
    was[x] = true;
    for (auto& p : G[x]) {
        int y = p.first;
        int id = p.second;
        if (id == fa) continue;
        if (was[y]) {
            found = true;
            return;
        }
        go_up[y] = {x, id};
        dfs_cyc(y, id);
        if (found) 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);
        return found;
    }

    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...