제출 #858268

#제출 시각아이디문제언어결과실행 시간메모리
858268Danilo21가장 긴 여행 (IOI23_longesttrip)C++17
40 / 100
18 ms1124 KiB
#include <bits/stdc++.h>
#include "longesttrip.h"

#define ll long long
#define ld long double
#define pb push_back
#define fi first
#define se second
#define en '\n'
#define sp ' '
#define tb '\t'
#define ri(n) int n; cin >> n
#define rl(n) ll n; cin >> n
#define rs(s) string s; cin >> s
#define rc(c) char c; cin >> c
#define rv(v) for (auto &x : v) cin >> x
#define pven(v) for (auto x : v) cout << x << en
#define pv(v) for (auto x : v) cout << x << sp; cout << en
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define yes cout << "YES" << en
#define no cout << "NO" << en
#define smin(a, b) a = min(a, b)
#define smax(a, b) a = max(a, b)
#define ssort(a, b) if (a < b) swap(a, b)
#define bitcnt(a) (__builtin_popcountll(a))
#define bithigh(a) (63-__builtin_clzll(a))
#define lg bithigh
#define highpow(a) (1LL << (ll)lg(a))

using namespace std;

const ll LINF = 2e18;
const int mxN = 300, INF = 2e9;

vector<int> Connect(const vector<int>& a, const vector<int>& b){

    vector<int> v;
    for (int s : a) v.pb(s);
    reverse(all(v));
    for (int s : b) v.pb(s);
    return v;
}

vector<int> D3(int N){

    vector<vector<int> > trips;
    for (int i = 0; i < N; i++)
        trips.pb({i});
    while (trips.size() > 2){
        array<vector<int>, 3> a;
        for (int i = 0; i < 3; i++){
            a[i] = trips.back();
            trips.pop_back();
        }
        for (int i = 0; i < 3; i++){
            bool f = 0;
            for (int j = i+1; j < 3; j++){
                if (are_connected({a[i][0]}, {a[j][0]})){
                    trips.pb(Connect(a[i], a[j]));
                    trips.pb(a[3-i-j]);
                    f = 1;
                    break;
                }
            }
            if (f) break;
        }
    }
    array<vector<int>, 2> a = {trips[0], trips[0]};
    array<vector<int>, 2> b = {trips[1], trips[1]};
    reverse(all(a[1])); reverse(all(b[1]));
    for (int i = 0; i < 2; i++)
        for (int j = 0; j < 2; j++)
            if (are_connected({a[i][0]}, {b[j][0]}))
                return Connect(a[i], b[j]);
    return trips[0].size() > trips[1].size() ? trips[0] : trips[1];
}

vector<int> longest_trip(int N, int D){

    if (D == 1) return D3(N);
    vector<int> trip = {0};
    for (int i = 1; i < N; i++){
        bool f = are_connected({trip.back()}, {i});
        if (f){
            trip.pb(i);
            continue;
        }
        if (i < N-1){
            trip.pb(i+1);
            trip.pb(i);
            i++;
            continue;
        }
        reverse(all(trip));
        trip.pb(i);
    }
    return trip;
}
#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...