Submission #1166980

#TimeUsernameProblemLanguageResultExecution timeMemory
1166980HappyCapybaraRail (IOI14_rail)C++20
30 / 100
40 ms596 KiB
#include "rail.h"
#include<bits/stdc++.h>
using namespace std;

void findLocation(int N, int first, int location[], int stype[]){
    location[0] = first;
    stype[0] = 1;
    if (N == 1) return;
    vector<int> d1(N, 0), d2(N, 0);
    int csf = pow(10, 7), cs;
    for (int i=1; i<N; i++){
        d1[i] = getDistance(0, i);
        if (d1[i] < csf){
            csf = d1[i];
            cs = i;
        }
    }
    location[cs] = first+d1[cs];
    stype[cs] = 2;
    vector<pair<int,int>> l, r;
    for (int i=1; i<N; i++){
        if (i == cs) continue;
        d2[i] = getDistance(cs, i);
        if (d2[i] > d1[i]) r.push_back({d1[i], i});
        else l.push_back({d2[i], i});
    }
    int lm = 0, rm = cs;
    vector<pair<int,int>> ls, rs;
    sort(l.begin(), l.end());
    sort(r.begin(), r.end());
    for (auto [d, i] : l){
        vector<int> pl;
        for (auto [j, mx] : ls){
            if (d-d2[j] < mx) pl.push_back(location[j]+d-d2[j]);
        }
        int res = getDistance(lm, i);
        bool b = true;
        for (int x : pl){
            if (x == location[lm]+res){
                location[i] = x;
                stype[i] = 2;
                b = false;
                break;
            }
        }
        if (b){
            location[i] = location[cs]-d;
            stype[i] = 1;
            ls.push_back({i, location[lm]-location[i]});
            lm = i;
        }
    }
    for (auto [d, i] : r){
        vector<int> pl;
        for (auto [j, mx] : rs){
            if (d-d1[j] < mx) pl.push_back(location[j]-(d-d1[j]));
        }
        int res = getDistance(rm, i);
        bool b = true;
        for (int x : pl){
            if (x == location[rm]-res){
                location[i] = x;
                stype[i] = 1;
                b = false;
                break;
            }
        }
        if (b){
            location[i] = location[0]+d;
            stype[i] = 2;
            rs.push_back({i, location[i]-location[rm]});
            rm = i;
        }
    }
    //cout << endl;
    //for (int i=0; i<N; i++) cout << stype[i] << " " << location[i] << endl;
    return;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...