Submission #773761

#TimeUsernameProblemLanguageResultExecution timeMemory
773761danikoynovRail (IOI14_rail)C++14
8 / 100
294 ms98568 KiB
#include "rail.h"
#include <bits/stdc++.h>

using namespace std;

const int maxn = 5010;
int dist[maxn][maxn], used[maxn];
void findLocation(int N, int first, int location[], int stype[])
{
    location[0] = first;
    stype[0] = 1;

    if (N == 1)
        return;

    for (int i = 0; i < N; i ++)
        for (int j = i + 1; j < N; j ++)
        {
            dist[i][j] = dist[j][i] = getDistance(i, j);
        }

    int closest = -1;
    for (int i = 1; i < N; i ++)
    {
        if (closest == -1 || dist[0][closest] > dist[0][i])
            closest = i;
    }

    location[closest] = location[0] + dist[0][closest];
    stype[0] = 1;
    stype[closest] = 2;

    int left = 0, right = closest;
    used[left] = used[right] = 1;

    int cnt = 2;
    while(cnt < N)
    {
        int closest_left = -1;
        int closest_right = -1;

        for (int i = 0; i < N; i ++)
        {
            if (used[i])
                continue;

            if (closest_left == -1 ||
                    dist[left][closest_left] > dist[left][i])
                closest_left = i;

            if (closest_right == -1 ||
                    dist[right][closest_right] > dist[right][i])
                closest_right = i;
        }

        if (closest_left != closest_right)
        {
            used[closest_left] = used[closest_right] = 1;
            location[closest_left] = location[left] + dist[left][closest_left];
            location[closest_right] = location[right] - dist[right][closest_right];
            stype[closest_left] = 2;
            stype[closest_right] = 1;
            right = closest_left;
            left = closest_right;
            cnt = cnt + 2;
        }
        else
        {
            int vertex = closest_left;
            used[vertex] = 1;
            cnt ++;
            if (dist[left][vertex] < dist[right][vertex])
            {
                location[vertex] = location[left] + dist[left][vertex];
                stype[vertex] = 2;
                right = vertex;
            }
            else
            {
                location[vertex] = location[right] - dist[right][vertex];
                stype[vertex] = 1;
                left = vertex;
            }
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...