Submission #290391

#TimeUsernameProblemLanguageResultExecution timeMemory
290391AaronNaiduRail (IOI14_rail)C++14
30 / 100
423 ms117880 KiB
#include <bits/stdc++.h>
#include "rail.h"
using namespace std;

int distFrom0[6001];
int distFromMin[6001];
int queries[6001][6001];
int closest[6001];
int minDists[6001];
bool doneWith[6001];


void findLocation(int n, int first, int location[], int sType[]) {
    location[0] = first;
    sType[0] = 1;
    doneWith[0] = true;
    if (n == 1)
    {
        return;
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = i+1; j < n; j++)
        {
            queries[i][j] = getDistance(i,j);
            queries[j][i] = queries[i][j];
        }
    }
    for (int i = 0; i < n; i++)
    {
        minDists[i] = 1000000007;
        for (int j = 0; j < n; j++)
        {
            if (j != i and queries[i][j] < minDists[i])
            {
                minDists[i] = queries[i][j];
                closest[i] = j;
            }
        }
    }
    int otherIndex = closest[0];
    sType[otherIndex] = 2;
    location[otherIndex] = first + queries[0][otherIndex]; 
    doneWith[otherIndex] = true;
    for (int i = 0; i < n; i++)
    {
        if (!doneWith[i])
        {
            if (queries[i][0] < queries[i][otherIndex])
            {
                if (closest[i] == 0 or queries[i][0] < queries[closest[i]][0])
                {
                    sType[i] = 2;
                    location[i] = location[0] + queries[i][0];
                    //cout << "Used1\n";
                }
                else
                {
                    sType[i] = 1;
                    location[i] = location[0] + queries[i][0] - 2*minDists[i];
                    //cout << "Used2\n";
                }
                
            }
            else
            {
                if (closest[i] == otherIndex or queries[i][otherIndex] < queries[closest[i]][otherIndex])
                {
                    sType[i] = 1;
                    location[i] = location[otherIndex] - queries[i][otherIndex];
                    //cout << "Used3\n";
                }
                else
                {
                    sType[i] = 2;
                    location[i] = location[otherIndex] - queries[i][otherIndex] + 2*minDists[i];
                    //cout << "Used4\n";
                }
            }
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...