답안 #1082136

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1082136 2024-08-30T18:01:10 Z Boas 가장 긴 여행 (IOI23_longesttrip) C++17
15 / 100
917 ms 5816 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)
        {
            vi best;
            for (int mask = 1; mask < (1 << N); mask++)
            {
                vi all;
                loop(N, i) if ((1 << i) & mask) all.pb(i);
                do
                {
                    if (sz(all) <= sz(best))
                        break;
                    bool val = 1;
                    loop(sz(all) - 1, i) if (!adj[all[i]].count(all[i + 1]))
                    {
                        val = 0;
                    }
                    if (val)
                        best = all;
                } while (next_permutation(ALL(all)));
            }
            return best;
        }
        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 {};
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Runtime error 229 ms 5816 KB Execution killed with signal 6
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 344 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 0 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 344 KB Output is correct
2 Correct 5 ms 344 KB Output is correct
3 Correct 5 ms 344 KB Output is correct
4 Correct 7 ms 344 KB Output is correct
5 Correct 4 ms 344 KB Output is correct
6 Correct 8 ms 344 KB Output is correct
7 Correct 5 ms 344 KB Output is correct
8 Correct 6 ms 344 KB Output is correct
9 Correct 4 ms 344 KB Output is correct
10 Correct 5 ms 344 KB Output is correct
11 Correct 6 ms 344 KB Output is correct
12 Correct 6 ms 344 KB Output is correct
13 Correct 6 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 344 KB Output is correct
2 Correct 24 ms 344 KB Output is correct
3 Correct 153 ms 344 KB Output is correct
4 Correct 445 ms 1588 KB Output is correct
5 Correct 887 ms 3284 KB Output is correct
6 Correct 8 ms 344 KB Output is correct
7 Correct 24 ms 344 KB Output is correct
8 Correct 152 ms 344 KB Output is correct
9 Correct 330 ms 856 KB Output is correct
10 Correct 854 ms 3484 KB Output is correct
11 Correct 917 ms 3392 KB Output is correct
12 Correct 892 ms 3592 KB Output is correct
13 Correct 872 ms 3560 KB Output is correct
14 Correct 7 ms 344 KB Output is correct
15 Runtime error 3 ms 344 KB Execution killed with signal 6
16 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 344 KB Output is correct
2 Correct 24 ms 344 KB Output is correct
3 Partially correct 170 ms 600 KB Output is partially correct
4 Partially correct 446 ms 972 KB Output is partially correct
5 Partially correct 847 ms 3424 KB Output is partially correct
6 Correct 10 ms 344 KB Output is correct
7 Correct 33 ms 344 KB Output is correct
8 Partially correct 168 ms 600 KB Output is partially correct
9 Partially correct 363 ms 856 KB Output is partially correct
10 Partially correct 859 ms 3384 KB Output is partially correct
11 Partially correct 901 ms 3556 KB Output is partially correct
12 Partially correct 865 ms 3616 KB Output is partially correct
13 Partially correct 883 ms 3704 KB Output is partially correct
14 Correct 10 ms 344 KB Output is correct
15 Runtime error 2 ms 344 KB Execution killed with signal 6
16 Halted 0 ms 0 KB -