Submission #281871

#TimeUsernameProblemLanguageResultExecution timeMemory
281871SamAndRail (IOI14_rail)C++17
8 / 100
277 ms98424 KiB
#include "rail.h"
#include <bits/stdc++.h>
using namespace std;
#define m_p make_pair
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
typedef long long ll;
const int N = 5003;

int n;

int ans[N][N];
int qry(int x, int y)
{
    if (ans[x][y] != -1)
        return ans[x][y];
    return ans[x][y] = ans[y][x] = getDistance(x, y);
}

int getnext(int s, int location[], int stype[])
{
    int minu = N * 5;
    int minx;
    for (int x = 0; x < n; ++x)
    {
        if (x == s)
            continue;
        if (qry(s, x) < minu)
        {
            minu = qry(s, x);
            minx = x;
        }
    }
    if (stype[s] == 1)
    {
        stype[minx] = 2;
        location[minx] = location[s] + qry(s, minx);
    }
    else
    {
        stype[minx] = 1;
        location[minx] = location[s] - qry(s, minx);
    }
    return minx;
}

bool c[N];
int go(int x, int location[], int stype[])
{
    int u = getnext(x, location, stype);
    int s = getnext(u, location, stype);

    memset(c, false, sizeof c);
    c[u] = true;
    while (1)
    {
        int minu = N * 5;
        int minx;
        for (int x = 0; x < n; ++x)
        {
            if (x == s)
                continue;
            if (c[x])
                continue;
            if (qry(s, x) < qry(u, x))
            {
                if (qry(s, x) < minu)
                {
                    minu = qry(s, x);
                    minx = x;
                }
            }
        }
        if (minu == N * 5)
            break;
        if (stype[s] == 1)
        {
            stype[minx] = 2;
            location[minx] = location[s] + qry(s, minx);
        }
        else
        {
            stype[minx] = 1;
            location[minx] = location[s] - qry(s, minx);
        }

        u = minx;
        c[u] = true;
    }
    return u;
}

void findLocation(int N_, int first, int location[], int stype[])
{
    n = N_;

    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            if (i == j)
                continue;
            ans[i][j] = -1;
        }
    }

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

    int x = go(0, location, stype);
    x = go(x, location, stype);
    x = go(x, location, stype);
    x = go(x, location, stype);
    x = go(x, location, stype);
}

Compilation message (stderr)

rail.cpp: In function 'int getnext(int, int*, int*)':
rail.cpp:17:17: warning: 'minx' may be used uninitialized in this function [-Wmaybe-uninitialized]
   17 |     if (ans[x][y] != -1)
      |         ~~~~~~~~^
rail.cpp:25:9: note: 'minx' was declared here
   25 |     int minx;
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...