제출 #1233287

#제출 시각아이디문제언어결과실행 시간메모리
1233287Sir_Ahmed_Imran가장 긴 여행 (IOI23_longesttrip)C++17
85 / 100
6 ms420 KiB
#include "longesttrip.h"
#include <bits/stdc++.h>
using namespace std;
#define nl '\n'
#define ff first
#define ss second
#define ll long long
#define ld long double
#define terminator main
#define pll pair<ll,ll>
#define append push_back
#define pii pair<int,int>
#define all(x) (x).begin(),(x).end()

int n;

vector<int> get(vector<int> & v, int x){
    vector<int> ans;
    for(int i = 0; i < x; i++)
        ans.append(v[i]);
    return ans;
}

vector<int> solve3(){
    vector<int> v;
    for(int i = 0; i < n; i++)
        v.append(i);
    return v;
}

vector<int> solve2(){
    deque<int> Q;
    Q.append(0);
    if(are_connected({0}, {1})){
        Q.append(1);
        if(are_connected({1}, {2}))
            Q.append(2);
        else Q.push_front(2);
    }
    else
        Q.append(2), Q.append(1);
    for(int i = 3; i < n; i++){
        if(are_connected({Q.back()}, {i}))
            Q.append(i);
        else Q.push_front(i);
    }
    vector<int> ans;
    while(!Q.empty()){
        ans.append(Q.front());
        Q.pop_front();
    }
    return ans;
}

vector<int> solve1(){
    int l, r;
    deque<int> d, q, t;
    d.append(0);
    vector<int> x, y, ans;
    for(int i = 1; i < n; i++){
        if(are_connected({d.back()}, {i})){
            d.append(i);
            if(!q.empty() && are_connected({i}, {q.back()})){
                while(!q.empty()){
                    d.append(q.back());
                    q.pop_back();
                }
            }
        }
        else q.append(i);
    }
    if(d.size() < q.size()) swap(d, q);
    t = d;
    while(!t.empty()){
        x.append(t.front());
        t.pop_front();
    }
    t = q;
    while(!t.empty()){
        y.append(t.front());
        t.pop_front();
    }
    if(y.empty() || !are_connected(x, y))
        return x;
    if(!are_connected({x[0]}, {x.back()})){
        if(are_connected({x[0]}, {y[0]}))
            reverse(all(x));
        for(auto & i : x)
            ans.append(i);
        for(auto & i : y)
            ans.append(i);
        return ans;
    }
    if(y.size() > 1 && !are_connected({y[0]}, {y.back()})){
        if(are_connected({y[0]}, {x[0]}))
            reverse(all(y));
        for(auto & i : y)
            ans.append(i);
        for(auto & i : x)
            ans.append(i);
        return ans;
    }
    l = r = 0;
    for(int i = 128; i > 0; i /= 2)
        if(l + i < x.size() && !are_connected(get(x, l + i), y))
            l += i;
    for(int i = 128; i > 0; i /= 2)
        if(r + i < y.size() && !are_connected({x[l]}, get(y, r + i)))
            r += i;
    for(int i = l + 1; i < x.size(); i++)
        ans.append(x[i]);
    for(int i = 0; i <= l; i++)
        ans.append(x[i]);
    for(int i = r; i < y.size(); i++)
        ans.append(y[i]);
    for(int i = 0; i < r; i++)
        ans.append(y[i]);
    return ans;
}

vector<int> longest_trip(int N, int D){
    n = N;
    if(D == 3)
        return solve3();
    if(D == 2)
        return solve2();
    return solve1();
}
#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...