제출 #1304130

#제출 시각아이디문제언어결과실행 시간메모리
1304130activedeltorre철로 (IOI14_rail)C++20
8 / 100
340 ms98528 KiB
#include "rail.h"
#include <iostream>
#include <vector>
using namespace std;
int d0[5005];
int d1[5005];
int dist[5005][5005];
void findLocation(int N, int first, int location[], int stype[])
{
    int n=N;
    int minim=-1,st=0,dr=-1,j,z;
    for(int i=0; i<n; i++)
    {
        for(int j=1; j<n; j++)
        {
            dist[i][j]=getDistance(i,j);
            dist[j][i]=dist[i][j];
        }
    }
    vector<int>vec;
    for(int i=1; i<n; i++)
    {
        d0[i]=dist[0][i];
        if(dr==-1 || d0[i]<d0[dr])
        {
            dr=i;
        }
        vec.push_back(i);
    }
    location[0]=first;
    stype[0]=1;
    vec.erase(vec.begin()+dr-1);
    location[dr]=d0[dr]+first;
    stype[dr]=2;
    st=0;
    for(int i=1; i<n; i++)
    {
        int minim=-1;
        for(z=0; z<vec.size(); z++)
        {
            j=vec[z];
            if(dist[st][j]<dist[st][dr] || dist[j][dr]<dist[st][dr])
            {
                if(dist[st][j]<dist[dr][j])
                {
                    location[j]=location[st]+dist[st][j];
                    stype[j]=2;
                }
                else
                {
                    location[j]=location[dr]-dist[st][j];
                    stype[j]=1;
                }
                vec.erase(vec.begin()+z);
            }
            else
            {
                if(minim==-1 || min(dist[st][j],dist[dr][j])<min(dist[st][minim],dist[dr][minim]))
                {
                    minim=j;
                }
            }
        }
        if(minim==-1)
        {
            break;
        }
        if(dist[st][minim]<dist[dr][minim])
        {
            location[minim]=location[st]+dist[st][minim];
            stype[minim]=2;
            dr=minim;
            for(int z=0; z<vec.size(); z++)
            {
                if(vec[z]==minim)
                {
                    vec.erase(vec.begin()+z);
                }
            }
        }
        else
        {
            location[minim]=location[dr]-dist[dr][minim];
            stype[minim]=1;
            st=minim;
            for(int z=0; z<vec.size(); z++)
            {
                if(vec[z]==minim)
                {
                    vec.erase(vec.begin()+z);
                }
            }
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...