Submission #1218245

#TimeUsernameProblemLanguageResultExecution timeMemory
1218245Hamed_Ghaffari철로 (IOI14_rail)C++20
100 / 100
212 ms27864 KiB
#include "rail.h"
#include <bits/stdc++.h>
using namespace std;

const int MXN = 5003;

int d_[MXN][MXN];

inline int d(int i, int j) {
    if(i>j) swap(i, j);
    if(d_[i][j]) return d_[i][j];
    return d_[i][j] = getDistance(i, j);
}

void findLocation(int n, int fir, int x[], int s[]) {
    x[0] = fir;
    fill(s, s+n, 0);
    s[0] = 1;
    if(n==1) return;
    int L=0, R = -1;
    int mn = 1e9;
    for(int i=1; i<n; i++)
        if(d(0, i) < mn) {
            mn = d(0, i);
            R = i;
        }
    s[R] = 2;
    x[R] = x[0] + d(0, R);
    for(int t=0, i, k; t<n-2; t++) {
        i = -1;
        for(int j=0; j<n; j++)
            if(!s[j] && (i==-1 || d(0, i)>d(0,j)))
                i=j;
        x[i] = x[L] + d(L, i);
        k = L;
        for(int j=0; j<n; j++)
            if(s[j]==1 && x[j]>x[k] && x[j]<x[i])
                k=j;
        if(x[i] < x[0] && d(R, i) == x[i] + x[R] - 2*x[k]) {
            s[i] = 2;
            continue;
        }

        x[i] = x[R] - d(R, i);
        k = R;
        for(int j=0; j<n; j++)
            if(s[j]==2 && x[j]<x[k] && x[j]>x[i])
                k=j;
        if(x[i] > x[0] && d(L, i) == 2*x[k] - x[i] - x[L]) {
            s[i] = 1;
            continue;
        }

        k = -1;
        for(int j=0; j<n; j++)
            if(s[j]==2 && x[L]<x[j] && x[j]<x[0])
                k = j;
        if(k!=-1) {
            if(d(i, L) - d(i, 0) == x[0]-x[L]) {
                s[i] = 2;
                x[i] = x[L] + d(L, i);
                R = i;
            }
            else {
                s[i] = 1;
                x[i] = x[R] - d(R, i);
                L = i;
            }
            continue;
        }

        x[i] = x[R] - d(i, R);
        k = R;
        for(int j=0; j<n; j++)
            if(s[j]==2 && x[j]<x[k] && x[j]>x[0])
                k=j;
        if(x[i] < x[L] && d(i, 0) == 2*x[k] - x[0] - x[i]) {
            s[i] = 1;
            L = i;
            continue;
        }

        s[i] = 2;
        x[i] = x[L] + d(L, i);
        R = i;
    }
}

/*

L   k   i   0   R
(   (   )   (   )

if( x[L] + d(L, i) < x[0])
    if( d(R, i) == x[L] + d(L, i) + x[R] - 2*x[k])
        ok

L   0   i   k   R
(   (   (   )   )

if( x[R] - d(R, i) > x[0])
    if( d(L, i) == 2*x[k] - x[L] - (x[R] - d(R, i)))
        ok


if {

L   ?   0   r
(   )   (   )

if( d(i, L) - d(i, 0) == x[0]-x[L] ) 4
else 1

}
else {

i   L   0   k   R
(   (   (   )   )

if( x[R] - d(i, R) < x[L])
    if( d(i, 0) == 2*x[k] - x[0] - (x[R] - d(i, R)))
        ok

}
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...