Submission #1329276

#TimeUsernameProblemLanguageResultExecution timeMemory
1329276liptonekLongest Trip (IOI23_longesttrip)C++20
85 / 100
9 ms448 KiB
#include <bits/stdc++.h>
#include "longesttrip.h"
using namespace std;

static mt19937 g(42);

vector<int> longest_trip(int n, int d)
{
    if(d==3)
    {
        vector<int> res(n);

        iota(res.begin(),res.end(),0);

        return res;
    }

    vector<int> nodes(n);

    iota(nodes.begin(),nodes.end(),0);
    shuffle(nodes.begin(),nodes.end(),g);

    vector<int> a={nodes[0]};
    vector<int> b={nodes[1]};

    bool last=true;

    for(int i=2; i<n; i++)
    {
        int v=nodes[i];

        if(last)
        {
            if(are_connected({v},{a.back()}))
            {
                a.push_back(v);
            }
            else if(are_connected({v},{b.back()}))
            {
                b.push_back(v);

                last=false;
            }
            else
            {
                reverse(b.begin(),b.end());

                a.insert(a.end(),b.begin(),b.end());

                b={v};
                last=false;
            }
        }
        else
        {
            if(are_connected({v},{b.back()}))
            {
                b.push_back(v);
            }
            else if(are_connected({v},{a.back()}))
            {
                a.push_back(v);

                last=true;
            }
            else
            {
                reverse(a.begin(),a.end());

                b.insert(b.end(),a.begin(),a.end());

                a={v};
                last=true;
            }
        }
    }

    if(are_connected({a.back()},{b[0]}))
    {
        a.insert(a.end(),b.begin(),b.end());

        return a;
    }

    if(are_connected({a.back()},{b.back()}))
    {
        reverse(b.begin(),b.end());

        a.insert(a.end(),b.begin(),b.end());

        return a;
    }

    if(are_connected({a.back()},{b.back()}))
    {
        reverse(a.begin(),a.end());

        a.insert(a.end(),b.begin(),b.end());

        return a;
    }

    if(are_connected({a[0]},{b.back()}))
    {
        b.insert(b.end(),a.begin(),a.end());

        return b;
    }

    if(!are_connected(a,b))
    {
        return (a.size()>=b.size()) ? a : b;
    }

    int l=0;
    int r=a.size()-1;
    int aa=0;

    while(l<=r)
    {
        int mid=(l+r)/2;

        vector<int> sa(a.begin(),a.begin()+mid+1);

        if(are_connected(sa,b))
        {
            aa=mid;
            r=mid-1;
        }
        else
        {
            l=mid+1;
        }
    }

    int l2=0;
    int r2=b.size()-1;
    int ab=0;

    while(l2<=r2)
    {
        int mid=(l2+r2)/2;

        vector<int> sb(b.begin(),b.begin()+mid+1);

        if(are_connected({a[aa]},sb))
        {
            ab=mid;
            r2=mid-1;
        }
        else
        {
            l2=mid+1;
        }
    }

    vector<int> res;

    int sza=a.size();
    int szb=b.size();

    for(int k=0; k<sza; k++)
    {
        res.push_back(a[(aa+1+k)%sza]);
    }

    for(int k=0; k<szb; k++)
    {
        res.push_back(b[(ab-k+szb)%szb]);
    }

    return res;
}
#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...