제출 #1201255

#제출 시각아이디문제언어결과실행 시간메모리
1201255PagodePaiva가장 긴 여행 (IOI23_longesttrip)C++20
60 / 100
104 ms464 KiB
#include "longesttrip.h"
#include<bits/stdc++.h>

using namespace std;

const int N = 260;
int mark[N];
vector <int> usados;
set <int> s;

vector<int> longest_trip(int N, int D){
    for(int i = 0;i < N;i++){
        mark[i] = 0;
    }
    usados.clear();
    s.clear();
    deque <int> ans;
    ans.push_back(0);
    usados.push_back(0);
    mark[0] = 1;
    for(int i = 1;i < N;i++){
        if(are_connected({0}, {i})){
            ans.push_back(i);
            usados.push_back(i);
            mark[i] = 1;
            break;
        }
    }
    for(int i = 1;i < N;i++){
        if(mark[i])
            continue;
        s.insert(i);
    }
    bool aux = true;
    while(!s.empty()){        
        int i = (*s.begin());
        if(aux){
            vector <int> nao_usados;
            for(auto x : s){
                if(mark[i])
                    continue;
                nao_usados.push_back(x);
            }
            if(!are_connected(usados, nao_usados)){
                if(usados.size() < nao_usados.size()) swap(usados, nao_usados);
                return usados;
            }
            else{
                int l = 0, r = nao_usados.size();
                r--;
                while(l < r){
                    int mid = (l+r)/2;
                    vector <int> v;
                    for(int i = l;i <= mid;i++){
                        v.push_back(nao_usados[i]);
                    }
                    if(are_connected(v, usados)){
                        r = mid;
                    }
                    else{
                        l = mid+1;
                    }
                }
                int x = nao_usados[l];
                l = 0, r = usados.size();
                r--;
                while(l < r){
                    int mid = (l+r)/2;
                    vector <int> v;
                    for(int i = l;i <= mid;i++){
                        v.push_back(usados[i]);
                    }
                    if(are_connected({x}, v)){
                        r = mid;
                    }
                    else{
                        l = mid+1;
                    }
                }
                //cout << usados[l] << '\n';
                while(ans.back() != usados[l]){
                    int y = ans.back();
                    ans.pop_back();
                    ans.push_front(y);
                }
                ans.push_back(x);
                usados.push_back(x);
                s.erase(x);
            }
            if(!are_connected({ans.front()}, {ans.back()}))
                aux = false;
        }
        else{
            int x = ans.front(), y = ans.back();
            bool a = are_connected({i}, {x}), b = are_connected({i}, {y});
            if(a and b){
                aux = true;
                ans.push_back(i);
            }
            else if(a){
                ans.push_front(i);
            }
            else if(b){
                ans.push_back(i);
            }
            usados.push_back(i);
            s.erase(i);
        }
    }
    vector <int> resposta;
    while(!ans.empty()){
        resposta.push_back(ans.front());
        ans.pop_front();
    }
    return resposta;
}
#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...