Submission #1082131

# Submission time Handle Problem Language Result Execution time Memory
1082131 2024-08-30T17:54:26 Z Boas Longest Trip (IOI23_longesttrip) C++17
15 / 100
961 ms 4092 KB
#include "longesttrip.h"

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;

template <typename T1, typename T2>
using indexed_map = tree<T1, T2, less<T1>, rb_tree_tag, tree_order_statistics_node_update>;
template <typename T>
using indexed_set = indexed_map<T, null_type>;

#define loop(x, i) for (int i = 0; i < (x); i++)
#define loop1(x, i) for (int i = 1; i <= (x); i++)
#define rev(x, i) for (int i = (int)(x) - 1; i >= 0; i--)
#define itloop(x) for (auto it = begin(x); x != end(x); it++)
#define itrev(x) for (auto it = rbegin(x); x != rend(x); it++)
#define INF32 ((int32_t)(2e9 + 1))
#define ALL(x) begin(x), end(x)
#define RALL(x) rbegin(x), rend(x)
#define removeIn(x, l) l.erase(find(ALL(l), x))
#define pb push_back
#define sz(x) (int)(x).size()
#define F first
#define S second
#define var const auto &
#define foreach(l) for (var e : l)

typedef int8_t i8;
typedef int16_t i16;
typedef int32_t i32;
typedef int64_t i64;
typedef pair<int, int> ii;
typedef tuple<int, int, int> iii;
typedef tuple<int, int, int, int> iiii;
typedef vector<int> vi;
typedef vector<i32> vi32;
typedef vector<vi> vvi;
typedef vector<vvi> vvvi;
typedef vector<vi32> vvi32;
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef vector<vii> vvii;
typedef vector<viii> vviii;
typedef set<int> si;
typedef set<ii> sii;
typedef set<iii> siii;
typedef vector<si> vsi;
typedef vector<sii> vsii;
typedef vector<vsi> vvsi;
typedef vector<string> vstr;
typedef vector<vector<string>> vvstr;
typedef vector<bool> vb;
typedef vector<vb> vvb;

vi longest_trip(int N, int D)
{
    if (D >= 2)
    {
        vi res(N);
        iota(ALL(res), 0);
        if (D == 3)
        {
            return res;
        }
        si resterend;
        loop1(N - 1, i) resterend.insert(res[i]);
        loop1(N - 1, i)
        {
            auto it = resterend.begin();
            if (are_connected({res[i - 1]}, {*it}))
            {
                res[i] = *it;
                resterend.erase(it);
            }
            else
            {
                if (resterend.size() == 1)
                {
                    res.insert(res.begin(), *it);
                    res.pop_back();
                    return res;
                }
                res[i] = *next(it);
                resterend.erase(next(it));
            }
        }
        return res;
    }
    else
    {
        vsi adj(N);
        for (int i = 0; i < N; i++)
        {
            for (int j = i + 1; j < N; j++)
            {
                if (are_connected({i}, {j}))
                {
                    adj[i].insert(j);
                    adj[j].insert(i);
                }
            }
        }
        if (N <= 4)
        {
            vb vis(N);
            vi route;
            auto dfs = [&](auto &&self, int i) -> void
            {
                route.pb(i);
                vis[i] = 1;
                for (int j : adj[i])
                {
                    if (!vis[j])
                        self(self, j);
                }
            };
            int minAdj = 5;
            loop(N, i) minAdj = min(minAdj, sz(adj[i]));
            loop(N, i)
            {
                if (minAdj == sz(adj[i]))
                {
                    dfs(dfs, i);
                    break;
                }
            }
            // assert(sz(route) == N);
            loop(N - 1, i) assert(adj[route[i]].count(route[i + 1]));
            return route;
        }
        si clique1, clique2;
        loop(N, i)
        {
            for (int j = i + 1; j < N; j++)
            {
                if (adj[i].count(j))
                    continue;
                if (clique1.empty())
                {
                    clique1.insert(i);
                    clique2.insert(j);
                }
                else
                {
                    bool iVal2 = 1, iVal1 = 1, jVal2 = 1, jVal1 = 1;
                    for (int k : clique1)
                    {
                        if (adj[i].count(k))
                        {
                            iVal2 = 0;
                        }
                        else
                        {
                            iVal1 = 0;
                        }
                        if (adj[j].count(k))
                        {
                            jVal2 = 0;
                        }
                        else
                        {
                            jVal1 = 0;
                        }
                    }
                    for (int k : clique2)
                    {
                        if (adj[i].count(k))
                        {
                            iVal1 = 0;
                        }
                        else
                        {
                            iVal2 = 0;
                        }
                        if (adj[j].count(k))
                        {
                            jVal1 = 0;
                        }
                        else
                        {
                            jVal2 = 0;
                        }
                    }
                    if (iVal1 || jVal2)
                    {
                        clique1.insert(i);
                        clique2.insert(j);
                    }
                    else if (iVal2 || jVal1)
                    {
                        clique2.insert(i);
                        clique1.insert(j);
                    }
                }
            }
        }
        loop(N, i)
        {
            if (clique1.count(i) || clique2.count(i))
                continue;
            bool iVal2 = 1, iVal1 = 1;
            for (int k : clique1)
            {
                if (!adj[i].count(k))
                {
                    iVal1 = 0;
                }
            }
            for (int k : clique2)
            {
                if (!adj[i].count(k))
                {
                    iVal2 = 0;
                }
            }
            if (iVal1)
            {
                clique1.insert(i);
            }
            else if (iVal2)
            {
                clique2.insert(i);
            }
            // else throw;
        }
        ii bridge = {-1, -1};
        for (int i : clique1)
        {
            for (int j : adj[i])
            {
                if (clique2.count(j))
                {
                    bridge = {i, j};
                    break;
                }
            }
        }
        // assert(sz(clique1) + sz(clique2) == N);
        for (int i : clique1)
        {
            for (int j : clique1)
            {
                // assert(i == j || adj[i].count(j));
            }
        }
        for (int i : clique2)
        {
            for (int j : clique2)
            {
                // assert(i == j || adj[i].count(j));
            }
        }
        vi res;
        if (bridge.F == -1)
        {
            if (sz(clique1) < sz(clique2))
            {
                swap(clique1, clique2);
            }
            for (int i : clique1)
                res.pb(i);
            // loop(sz(res) - 1, i) assert(adj[res[i]].count(res[i + 1]));
            return res;
        }
        for (int i : clique1)
        {
            if (i != bridge.F)
                res.pb(i);
        }
        res.pb(bridge.F);
        res.pb(bridge.S);
        for (int i : clique2)
        {
            if (i != bridge.S)
                res.pb(i);
        }
        // assert(sz(res) == N);
        //  loop(sz(res) - 1, i) assert(adj[res[i]].count(res[i + 1]));
        return res;
    }
    // throw;
    return {};
}

Compilation message

longesttrip.cpp: In function 'vi longest_trip(int, int)':
longesttrip.cpp:242:22: warning: unused variable 'j' [-Wunused-variable]
  242 |             for (int j : clique1)
      |                      ^
longesttrip.cpp:240:18: warning: unused variable 'i' [-Wunused-variable]
  240 |         for (int i : clique1)
      |                  ^
longesttrip.cpp:249:22: warning: unused variable 'j' [-Wunused-variable]
  249 |             for (int j : clique2)
      |                      ^
longesttrip.cpp:247:18: warning: unused variable 'i' [-Wunused-variable]
  247 |         for (int i : clique2)
      |                  ^
# Verdict Execution time Memory Grader output
1 Runtime error 1 ms 600 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 0 ms 344 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 0 ms 344 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 344 KB Output is correct
2 Correct 5 ms 344 KB Output is correct
3 Correct 6 ms 344 KB Output is correct
4 Correct 7 ms 344 KB Output is correct
5 Correct 5 ms 344 KB Output is correct
6 Correct 7 ms 344 KB Output is correct
7 Correct 6 ms 344 KB Output is correct
8 Correct 5 ms 344 KB Output is correct
9 Correct 5 ms 344 KB Output is correct
10 Correct 5 ms 344 KB Output is correct
11 Correct 5 ms 344 KB Output is correct
12 Correct 5 ms 344 KB Output is correct
13 Correct 5 ms 344 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 9 ms 344 KB Output is correct
2 Correct 19 ms 344 KB Output is correct
3 Correct 155 ms 344 KB Output is correct
4 Correct 449 ms 1380 KB Output is correct
5 Correct 927 ms 4092 KB Output is correct
6 Correct 5 ms 344 KB Output is correct
7 Correct 26 ms 344 KB Output is correct
8 Correct 137 ms 344 KB Output is correct
9 Correct 322 ms 796 KB Output is correct
10 Correct 946 ms 3432 KB Output is correct
11 Correct 923 ms 3444 KB Output is correct
12 Correct 939 ms 3652 KB Output is correct
13 Correct 883 ms 3844 KB Output is correct
14 Runtime error 1 ms 344 KB Execution killed with signal 6
15 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 8 ms 344 KB Output is correct
2 Correct 21 ms 344 KB Output is correct
3 Partially correct 181 ms 452 KB Output is partially correct
4 Partially correct 451 ms 1296 KB Output is partially correct
5 Partially correct 942 ms 3484 KB Output is partially correct
6 Correct 9 ms 344 KB Output is correct
7 Correct 23 ms 344 KB Output is correct
8 Partially correct 152 ms 344 KB Output is partially correct
9 Partially correct 330 ms 848 KB Output is partially correct
10 Partially correct 961 ms 3660 KB Output is partially correct
11 Partially correct 921 ms 3632 KB Output is partially correct
12 Partially correct 906 ms 3856 KB Output is partially correct
13 Partially correct 939 ms 3352 KB Output is partially correct
14 Runtime error 1 ms 600 KB Execution killed with signal 6
15 Halted 0 ms 0 KB -