Submission #725097

#TimeUsernameProblemLanguageResultExecution timeMemory
725097danikoynovFun Tour (APIO20_fun)C++14
0 / 100
1 ms264 KiB
#include "fun.h"

#include <bits/stdc++.h>
using namespace std;

const int maxn = 2e5 + 10;

int sub[maxn], dis[maxn];

bool cmp(int a, int b)
{
    return dis[a] < dis[b];
}
vector<int> createFunTour(int N, int Q)
{
    for (int i = 0; i < N; i ++)
        sub[i] = attractionsBehind(0, i);

    int centroid = 0;
    for (int i = 0; i < N; i ++)
    {
        if (sub[i] >= N / 2 && sub[i] < sub[centroid])
            centroid = i;
    }

    for (int i = 0; i < N; i ++)
        dis[i] = hoursRequired(centroid, i);

    vector < int > cp[3];
    int p[3];
    p[0] = p[1] = p[2] = -1;
    for (int i = 0; i < N; i ++)
    {
        if (dis[i] == 1)
        {
            if (p[0] == -1)
                p[0] = i;
            else if (p[1] == -1)
                p[1] = i;
            else
                p[2] = i;
        }
    }


    for (int i = 0; i < N; i ++)
    {
        if (i == centroid)
            continue;
        if (i == p[0])
            cp[0].push_back(i);
        else if (i == p[1])
            cp[1].push_back(i);
        else if (i == p[2])
            cp[2].push_back(i);
        else
        {
            if (hoursRequired(p[0], i) + 1 == dis[i])
                cp[0].push_back(i);
            else if (hoursRequired(p[1], i) + 1 == dis[i])
                cp[1].push_back(i);
            else
                cp[2].push_back(i);
        }
    }

    /**for (int v : cp[0])
        cout << v << " ";
    cout << endl;
    for (int v : cp[1])
        cout << v << " ";
    cout << endl;
        for (int v : cp[2])
        cout << v << " ";
    cout << endl;*/
    if (cp[0].size() < cp[1].size())
    {
        swap(p[0], p[1]);
        swap(cp[0], cp[1]);
    }

    if (cp[0].size() < cp[2].size())
    {
        swap(p[0], p[2]);
        swap(cp[0], cp[2]);
    }

    if (cp[1].size() < cp[2].size())
    {
        swap(p[1], p[2]);
        swap(cp[1], cp[2]);
    }

    sort(cp[0].begin(), cp[0].end(), cmp);
    sort(cp[1].begin(), cp[1].end(), cmp);
    sort(cp[2].begin(), cp[2].end(), cmp);
    vector < int > ans;
    while(cp[0].size() < cp[1].size() + cp[2].size())
    {
        ans.push_back(cp[1].back());
        ans.push_back(cp[2].back());
        cp[1].pop_back();
        cp[2].pop_back();
    }

    while(cp[2].size() > 0)
    {
        ans.push_back(cp[0].back());

        ans.push_back(cp[1].back());
          cp[0].pop_back();
        ans.push_back(cp[0].back());
        ans.push_back(cp[2].back());

                cp[0].pop_back();
        cp[1].pop_back();
        cp[2].pop_back();
    }
    while(cp[1].size() > 0)
    {
        ans.push_back(cp[0].back());
        ans.push_back(cp[1].back());
                        cp[0].pop_back();
        cp[1].pop_back();
    }
    while(cp[0].size() > 0)
    {
        ans.push_back(cp[0].back());
        cp[0].pop_back();
    }

    ans.push_back(centroid);
    /**cout << "tour" << endl;
    for (int v : ans)
        cout << v << " ";
    cout << endl;*/
    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...