Submission #1209832

#TimeUsernameProblemLanguageResultExecution timeMemory
1209832user736482Longest Trip (IOI23_longesttrip)C++20
5 / 100
3 ms416 KiB
#include "longesttrip.h"
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll int
#define ld long double
#define pb push_back
#define ff first
#define ss second
#define MOD 1000000009
#define INF 1000000019
#define POT (1<<20)
#define INFL 1000000000000000099


vector<ll> longest_trip(ll n,ll smiec){
    vector<ll>v;
    for(ll i=0;i<n;i++){
        v.pb(i);
    }
    for(ll i=0;i<n;i++){
        swap(v[i],v[n-1-rand()%(n-i)]);
    }
    stack<ll>st,st2;
    st.push(v.back());
    v.pop_back();
    for(ll i : v){
        if(st2.empty()){
            if(are_connected({i},{st.top()})){
                st.push(i);
            }
            else{
                st2.push(i);
            }
        }
        else{
            if(!are_connected({i},{st.top()})){
                st2.push(i);
            }
            else{
                if(are_connected({i},{st2.top()})){
                    st.push(i);
                    while(st2.size()){
                        st.push(st2.top());
                        st2.pop();
                    }
                }
                else{
                    st.push(i);
                }
            }
        }
    }
    vector<ll>v1,v2,V1,V2;
    while(st.size()){
        v1.pb(st.top());
        st.pop();
    }
    while(st2.size()){
        v2.pb(st2.top());
        st2.pop();
    }
    V1=v1;
    V2=v2;
    if(v1.empty() || v2.empty() || !are_connected(v1,v2)){
        if(v1.size()>v2.size())return v1;
        return v2;
    }
    if(!are_connected({v1[0]},{v1.back()})){
        if(!are_connected({v1.back()},{v2[0]}))reverse(v1.begin(),v1.end());
        for(ll i : v2)v1.pb(i);
        return v1;
    }
    swap(v1,v2);
    if(!are_connected({v1[0]},{v1.back()})){
        if(!are_connected({v1.back()},{v2[0]}))reverse(v1.begin(),v1.end());
        for(ll i : v2)v1.pb(i);
        return v1;
    }
    vector<ll>v3;
    while(v1.size()>1){
        while(v1.size()>v3.size()){
            v3.pb(v1.back());
            v1.pop_back();
        }
        if(!are_connected(v1,v2))swap(v1,v3);
        v3.clear();
    }
    swap(v1,v2);
    while(v1.size()>1){
        while(v1.size()>v3.size()){
            v3.pb(v1.back());
            v1.pop_back();
        }
        if(!are_connected(v1,v2))swap(v1,v3);
        v3.clear();
    }
    ll poz1;
    for(poz1=0;poz1<V1.size();poz1++){
        if(V1[poz1]==v1[0])break;
    }
    ll poz2;
    for(poz2=0;poz2<V2.size();poz2++){
        if(V2[poz2]==v2[0])break;
    }
    vector<ll>ans;
    for(ll i=poz1+1;i<=poz1+V1.size();i++)ans.pb(V1[i%V1.size()]);
    ans.pb(v1[0]);
    ans.pb(v2[0]);
    for(ll i=poz2+1;i<=poz2+V2.size();i++)ans.pb(V2[i%V2.size()]);
    return ans;
}
#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...