Submission #825778

# Submission time Handle Problem Language Result Execution time Memory
825778 2023-08-15T07:55:58 Z PixelCat Thousands Islands (IOI22_islands) C++17
31 / 100
35 ms 9784 KB
#include "islands.h"

#ifdef NYAOWO
#include "grader.cpp"
#endif

#include <bits/stdc++.h>
#define For(i, a, b) for(int i = a; i <= b; i++)
#define Forr(i, a, b) for(int i = a; i >= b; i--)
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define sz(x) ((int)x.size())
#define eb emplace_back
// #define int LL
using namespace std;
using i32 = int32_t;
using LL = long long;
using pii = pair<int, int>;

vector<int> join(vector<int> v, vector<int> o, bool rev = false) {
    if(rev) reverse(all(o));
    v.insert(v.end(), all(o));
    return v;
}

vector<int> solve_bidir_loop(vector<int> cy, vector<int> yc) {
    vector<int> res;
    res = join(res, cy);
    res = join(res, yc, true);
    res = join(res, cy, true);
    res = join(res, yc);
    return res;
}

const int MAXN = 100'000;
const int MAXM = 200'000;

struct Edge { int from, to, eid, rid; };
ostream& operator<<(ostream& os, const Edge &e) {
    os << "[" << e.from << " ";
    os << "(" << e.eid << " <-> " << e.rid << ")";
    os << " " << e.to << "]";
    return os;
}

Edge edges[MAXM + 10];
vector<int> adj[MAXN + 10];
int pid[MAXN + 10];
int dep[MAXN + 10];
bool vis[MAXN + 10];
int owo;
vector<int> uwu;

void dfs(int n, int p, int d) {
    vis[n] = true;
    dep[n] = d;
    vector<int> child;
    for(auto &eid:adj[n]) if(eid != p) {
        Edge e = edges[eid];
        if(vis[e.to]) {
            if(dep[e.to] < dep[n]) owo = eid;
        } else {
            pid[e.to] = eid;
            dfs(e.to, e.rid, d + 1);
            child.eb(eid);
        }
    }
    if(sz(child) > 1) {
        child.eb(n);
        uwu = child;
    }
}

variant<bool, vector<int>> find_journey(int N, int M, vector<int> U, vector<int> V) {
    // if (N == 4) {
    //   return vector<int>({0, 1, 2, 4, 0, 3, 2, 1, 4, 3});
    // }
    // return false;
    if(N == 2) {
        vector<int> e0, e1;
        For(i, 0, M - 1) {
            if(U[i] == 0) e0.eb(i);
            else e1.eb(i);
        }
        if(sz(e0) >= 2 && sz(e1) >= 1) {
            int a = e0[0], b = e0[1];
            int c = e1[0];
            return vector<int>({b, c, a, b, c, a});
        }
        return false;
    }

    map<pii, int> mp;
    For(i, 0, M - 1) {
        int x = U[i], y = V[i];
        if(mp.count(pii(y, x))) {
            int j = mp[pii(y, x)];
            mp.erase(pii(y, x));
            adj[x].push_back(i);
            adj[y].push_back(j);
            edges[i] = {x, y, i, j};
            edges[j] = {y, x, j, i};
        } else {
            mp[pii(x, y)] = i;
        }
    }

    #ifdef NYAOWO
    For(i, 0, M - 1) {
        cerr << edges[i] << "\n";
    }
    #endif

    owo = -1;
    pid[0] = -1;
    dfs(0, -1, 1);

    if(owo >= 0) {
        // For(i, 0, N - 1) {
        //     cerr << pid[i] << " \n"[i == N - 1];
        // }
        // cerr << "owo: " << owo << "\n";
        // return false;

        int x = edges[owo].from;  // lower
        int y = edges[owo].to;    // upper
        vector<int> chain;
        vector<int> cy, yc;
        {
            int cur = y;
            while(cur != 0) {
                auto e = edges[pid[cur]];
                chain.eb(e.eid);
                cur = e.from;
            }
            reverse(all(chain));
        }
        {
            cy.eb(edges[owo].eid);
            yc.eb(edges[owo].rid);
            int cur = x;
            while(cur != y) {
                auto e = edges[pid[cur]];
                cy.eb(e.eid);
                yc.eb(e.rid);
                cur = e.from;
            }
            reverse(all(cy));
            reverse(all(yc));
        }

        vector<int> ans;
        ans = join(ans, chain);
        ans = join(ans, solve_bidir_loop(cy, yc));
        ans = join(ans, chain, true);
        return ans;
    }

    if(sz(uwu)) {
        int x = uwu.back(); uwu.pop_back();
        vector<int> chain;
        {
            int cur = x;
            while(cur != 0) {
                auto e = edges[pid[cur]];
                chain.eb(e.eid);
                cur = e.from;
            }
            reverse(all(chain));
        }
        int a = edges[uwu[0]].eid;
        int c = edges[a].rid;
        int b = edges[uwu[1]].eid;
        int d = edges[b].rid;
        vector<int> cyc = {a, c, b, d, c, a, d, b};
        vector<int> ans;
        ans = join(ans, chain);
        ans = join(ans, cyc);
        ans = join(ans, chain, true);
        return ans;
    }

    return false;
}

/*

4 5
0 1
1 2
2 3
0 3
3 1

1
10
0 1 2 4 0 3 2 1 4 3


2 3
0 1
1 0
1 0

0
0

*/
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Correct 2 ms 2644 KB Output is correct
3 Correct 1 ms 2644 KB Output is correct
4 Correct 2 ms 2644 KB Output is correct
5 Correct 2 ms 2644 KB Output is correct
6 Correct 1 ms 2644 KB Output is correct
7 Correct 35 ms 6784 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Correct 2 ms 2644 KB Output is correct
3 Correct 1 ms 2644 KB Output is correct
4 Correct 1 ms 2644 KB Output is correct
5 Correct 1 ms 2644 KB Output is correct
6 Correct 30 ms 8524 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2800 KB Output is correct
2 Correct 2 ms 2644 KB Output is correct
3 Correct 2 ms 2644 KB Output is correct
4 Correct 2 ms 2644 KB Output is correct
5 Correct 2 ms 2772 KB Output is correct
6 Correct 2 ms 2644 KB Output is correct
7 Correct 2 ms 2644 KB Output is correct
8 Correct 1 ms 2644 KB Output is correct
9 Correct 2 ms 2664 KB Output is correct
10 Correct 3 ms 2900 KB Output is correct
11 Correct 2 ms 2644 KB Output is correct
12 Correct 3 ms 2932 KB Output is correct
13 Correct 2 ms 2660 KB Output is correct
14 Correct 2 ms 2644 KB Output is correct
15 Correct 1 ms 2644 KB Output is correct
16 Correct 2 ms 2644 KB Output is correct
17 Correct 23 ms 7276 KB Output is correct
18 Correct 20 ms 6464 KB Output is correct
19 Correct 2 ms 2644 KB Output is correct
20 Correct 1 ms 2644 KB Output is correct
21 Correct 2 ms 2644 KB Output is correct
22 Correct 2 ms 2644 KB Output is correct
23 Correct 28 ms 9784 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 2644 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Correct 2 ms 2644 KB Output is correct
3 Correct 1 ms 2644 KB Output is correct
4 Correct 2 ms 2644 KB Output is correct
5 Correct 2 ms 2644 KB Output is correct
6 Correct 1 ms 2644 KB Output is correct
7 Correct 35 ms 6784 KB Output is correct
8 Correct 2 ms 2644 KB Output is correct
9 Correct 2 ms 2644 KB Output is correct
10 Correct 1 ms 2644 KB Output is correct
11 Correct 1 ms 2644 KB Output is correct
12 Correct 1 ms 2644 KB Output is correct
13 Correct 30 ms 8524 KB Output is correct
14 Correct 2 ms 2800 KB Output is correct
15 Correct 2 ms 2644 KB Output is correct
16 Correct 2 ms 2644 KB Output is correct
17 Correct 2 ms 2644 KB Output is correct
18 Correct 2 ms 2772 KB Output is correct
19 Correct 2 ms 2644 KB Output is correct
20 Correct 2 ms 2644 KB Output is correct
21 Correct 1 ms 2644 KB Output is correct
22 Correct 2 ms 2664 KB Output is correct
23 Correct 3 ms 2900 KB Output is correct
24 Correct 2 ms 2644 KB Output is correct
25 Correct 3 ms 2932 KB Output is correct
26 Correct 2 ms 2660 KB Output is correct
27 Correct 2 ms 2644 KB Output is correct
28 Correct 1 ms 2644 KB Output is correct
29 Correct 2 ms 2644 KB Output is correct
30 Correct 23 ms 7276 KB Output is correct
31 Correct 20 ms 6464 KB Output is correct
32 Correct 2 ms 2644 KB Output is correct
33 Correct 1 ms 2644 KB Output is correct
34 Correct 2 ms 2644 KB Output is correct
35 Correct 2 ms 2644 KB Output is correct
36 Correct 28 ms 9784 KB Output is correct
37 Incorrect 2 ms 2660 KB Output isn't correct
38 Halted 0 ms 0 KB -