Submission #320664

#TimeUsernameProblemLanguageResultExecution timeMemory
320664lohachoRail (IOI14_rail)C++14
100 / 100
123 ms39524 KiB
#include "rail.h"
#include <bits/stdc++.h>

using namespace std;

using LL = long long;
const int MOD = (int)1e9 + 7;
const int NS = (int)5004;
vector<pair<int, int>> l, r;
int dis[5004][5004];

void findLocation(int N, int first, int location[], int stype[]){
    int rnum, mn = MOD;
    for(int i = 1; i < N; ++i){
        dis[0][i] = getDistance(0, i);
        if(dis[0][i] < mn){
            mn = dis[0][i];
            rnum = i;
        }
    }
    for(int i = 1; i < N; ++i){
        if(i == rnum){
            continue;
        }
        dis[rnum][i] = getDistance(rnum, i);
    }
    for(int i = 1; i < N; ++i){
        if(i == rnum){
            continue;
        }
        if(dis[0][i] == dis[0][rnum] + dis[rnum][i]){
            l.push_back({dis[rnum][i], i});
        }
        else{
            r.push_back({dis[0][i], i});
        }
    }
    sort(r.begin(), r.end());
    location[0] = first, stype[0] = 1;
    location[rnum] = first + dis[0][rnum], stype[rnum] = 2;
    vector<int> last;
    for(auto&i:r){
        int num = i.second;
        if(!(int)last.size()){
            location[num] = first + dis[0][num], stype[num] = 2;
            last = {num}; continue;
        }
        dis[last.back()][num] = getDistance(last.back(), num);
        int f = 0;
        for(int i = (int)last.size() - 1; i >= 0; --i){
            int ndis = dis[last.back()][num] - location[last.back()] + location[last[i]];
            if(ndis < 0){
                break;
            }
            dis[last[i]][num] = ndis;
            if(dis[0][num] == dis[0][last[i]] + dis[last[i]][num]){
                f = 1;
                location[num] = location[last[i]] - dis[last[i]][num], stype[num] = 1;
                break;
            }
        }
        if(!f){
            location[num] = first + dis[0][num], stype[num] = 2;
            last.push_back(num);
        }
    }
    sort(l.begin(), l.end());
    for(auto&i:l){
        int num = i.second;
        if(!(int)last.size()){
            location[num] = location[rnum] - dis[rnum][num], stype[num] = 1;
            last = {num};
            continue;
        }
        dis[last.back()][num] = getDistance(last.back(), num);
        int f = 0;
        for(int i = (int)last.size() - 1; i >= 0; --i){
            int ndis = dis[last.back()][num] - location[last[i]] + location[last.back()];
            if(ndis < 0){
                break;
            }
            dis[last[i]][num] = ndis;
            if(dis[rnum][num] == dis[rnum][last[i]] + dis[last[i]][num]){
                f = 1;
                location[num] = location[last[i]] + dis[last[i]][num], stype[num] = 2;
                break;
            }
        }
        if(!f){
            location[num] = location[rnum] - dis[rnum][num], stype[num] = 1;
            last.push_back(num);
        }
    }
//    for(int i = 0; i < N; ++i){
//        cout << stype[i] << ' ' << location[i] << endl;
//    }
}

Compilation message (stderr)

rail.cpp: In function 'void findLocation(int, int, int*, int*)':
rail.cpp:71:59: warning: 'rnum' may be used uninitialized in this function [-Wmaybe-uninitialized]
   71 |             location[num] = location[rnum] - dis[rnum][num], stype[num] = 1;
      |                                              ~~~~~~~~~~~~~^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...