Submission #840493

#TimeUsernameProblemLanguageResultExecution timeMemory
840493ogkostyaLongest Trip (IOI23_longesttrip)C++17
85 / 100
21 ms336 KiB
#include "longesttrip.h"

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

    std::vector<int> an1 = {};
    std::vector<int> an2 = {};

    an1.push_back(0);

    std::vector<int> temp1 = {};
    std::vector<int> temp2 = {};
    for (int i = 1; i < N; i++)
    {
        temp1.clear();
        temp1.push_back(i);
        temp2.clear();
        temp2.push_back(an1.back());

        if (are_connected(temp1, temp2))
        {
            an1.push_back(i);
        }
        else
        {
            if (an2.size() == 0)
            {
                an2.push_back(i);
            }
            else
            {
                temp2.clear();
                temp2.push_back(an2.back());
                if (are_connected(temp1, temp2))
                {
                    an2.push_back(i);
                }
                else
                {
                    while (an2.size() > 0)
                    {
                        an1.push_back(an2.back());
                        an2.pop_back();
                    }
                    an2.push_back(i);
                }
            }
        }
    }

    if (an2.size() > 0)
    {
        if (an2.size() > an1.size())
        {
            std::vector<int> an3 = an1;
            an1 = an2;
            an2 = an3;
        }

        temp1.clear();
        temp1.push_back(an1.back());
        temp2.clear();
        temp2.push_back(an2.back());
        if (are_connected(temp1, temp2))
        {
            while (an2.size() > 0)
            {
                an1.push_back(an2.back());
                an2.pop_back();
            }
        }
        else
        {
            temp2.clear();
            temp2.push_back(an2.front());
            if (are_connected(temp1, temp2))
            {
                int l = an2.size();
                for (int i = 0; i < l; i++)
                {
                    an1.push_back(an2[i]);
                }
            }
            else
            {
                temp1.clear();
                temp1.push_back(an1.front());
                temp2.clear();
                temp2.push_back(an2.back());
                if (are_connected(temp1, temp2))
                {
                    int l = an1.size();
                    for (int i = 0; i < l; i++)
                    {
                        an2.push_back(an1[i]);
                    }
                    an1 = an2;
                }
                else
                {
                    if (are_connected(an1, an2))
                    {
                        int l = 0, r = an1.size() - 1;
                        while (l < r)
                        {
                            int m = (l + r) / 2;
                            temp1.clear();
                            for (int i = l; i <= m; i++)
                            {
                                temp1.push_back(an1[i]);
                            }
                            if (are_connected(temp1, an2))
                            {
                                r = m;
                            }
                            else
                            {
                                l = m + 1;
                            }
                        }
                        int c1 = l;
                        temp1.clear();
                        temp1.push_back(an1[c1]);

                        l = 0, r = an2.size() - 1;
                        while (l < r)
                        {
                            int m = (l + r) / 2;
                            temp2.clear();
                            for (int i = l; i <= m; i++)
                            {
                                temp2.push_back(an2[i]);
                            }
                            if (are_connected(temp1, temp2))
                            {
                                r = m;
                            }
                            else
                            {
                                l = m + 1;
                            }
                        }
                        int c2 = l;

                        std::vector<int> an3 = {};
                        int l1 = an1.size();
                        int l2 = an2.size();

                        for (int i = c1+1; i < l1; i++)
                        {
                            an3.push_back(an1[i]);
                        }
                        for (int i = 0; i <= c1; i++)
                        {
                            an3.push_back(an1[i]);
                        }
                        for (int i = c2; i < l2; i++)
                        {
                            an3.push_back(an2[i]);
                        }
                        for (int i = 0; i < c2; i++)
                        {
                            an3.push_back(an2[i]);
                        }
                        an1 = an3;
                    }
                }
            }
        }
    }

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