Submission #725098

#TimeUsernameProblemLanguageResultExecution timeMemory
725098danikoynovFun Tour (APIO20_fun)C++14
0 / 100
1 ms340 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;
    int last = -1;
    while(ans.size() != N - 1)
    {
        int cur = -1;
        if (last != 0 && (cur == -1 || cp[0].size() > cp[cur].size()))
            cur = 0;
                if (last != 1 && (cur == -1 || cp[1].size() > cp[cur].size()))
            cur = 1;
                    if (last != 2 && (cur == -1 || cp[2].size() > cp[cur].size()))
            cur = 2;
            ans.push_back(cp[cur].back());
            cp[cur].pop_back();
            last = cur;
    }
    /**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;
}

Compilation message (stderr)

fun.cpp: In function 'std::vector<int> createFunTour(int, int)':
fun.cpp:99:22: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   99 |     while(ans.size() != N - 1)
      |           ~~~~~~~~~~~^~~~~~~~
#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...