Submission #1216302

#TimeUsernameProblemLanguageResultExecution timeMemory
1216302Hamed_Ghaffari철로 (IOI14_rail)C++20
8 / 100
137 ms18524 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 i=1, k; i<n; i++)
        if(!s[i]) {

            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...