제출 #773971

#제출 시각아이디문제언어결과실행 시간메모리
773971boris_mihov철로 (IOI14_rail)C++17
30 / 100
45 ms524 KiB
#include "rail.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cassert>
#include <vector>

typedef long long llong;
const int MAXN = 100000 + 10;
const int INF  = 1e9;

int n;
int distA[MAXN];
int distB[MAXN];
int myDist(int u, int v)
{
    return getDistance(u - 1, v - 1);
}

void findLocation(int N, int first, int location[], int stype[])
{
    n = N;
    for (int i = 2 ; i <= n ; ++i)
    {
        distA[i] = myDist(1, i);
    }

    location[0] = first;
    stype[0] = 1;

    int minIdx = 2;
    for (int i = 3 ; i <= n ; ++i)
    {
        assert(distA[i] != distA[minIdx]);
        if (distA[i] < distA[minIdx])
        {
            minIdx = i;
        }
    }

    location[minIdx - 1] = first + distA[minIdx];
    stype[minIdx - 1] = 2;

    for (int i = 2 ; i <= n ; ++i)
    {
        if (i == minIdx)
        {
            continue;
        }

        distB[i] = myDist(minIdx, i);
    }

    for (int i = 2 ; i <= n ; ++i)
    {
        if (i == minIdx)
        {
            continue;
        }

        if (distA[i] == distB[i] + location[minIdx - 1] - location[0])
        {
            stype[i - 1] = 1;
            location[i - 1] = location[minIdx - 1] - distB[i];
        }

        if (distB[i] == distA[i] + location[minIdx - 1] - location[0])
        {
            stype[i - 1] = 2;
            location[i - 1] = distA[i] + location[0];
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...