제출 #1327970

#제출 시각아이디문제언어결과실행 시간메모리
1327970SSKMFToll (BOI17_toll)C++20
100 / 100
87 ms9732 KiB
#include <bits/stdc++.h>
using namespace std;

vector < pair <int , int> > adiacenta[50005][2] , intrebari[50005];
int rezultat[10001] , distanta[50005];

void Divide (const int stanga , const int dreapta , const int factor)
{
    if (stanga >= dreapta)
        { return; }
    
    const int inceput = stanga + (dreapta - stanga + 1) / factor / 2 * factor;
    const int sfarsit = stanga + ((dreapta - stanga + 1) / factor / 2 + 1) * factor - 1;

    Divide(stanga , inceput - 1 , factor);
    Divide(sfarsit + 1 , dreapta , factor);

    vector < pair < int , pair <int , int> > > actual;
    for (int __nod = stanga ; __nod <= sfarsit ; __nod++) {
        for (auto& intrebare : intrebari[__nod]) {
            if (intrebare.first >= inceput && intrebare.first <= dreapta)
                { actual.emplace_back(__nod , intrebare); rezultat[intrebare.second] = INT32_MAX; }
        }
    }

    for (int nod = inceput ; nod <= sfarsit ; nod++)
    {
        for (int __nod = stanga ; __nod <= dreapta ; __nod++)
            { distanta[__nod] = INT32_MAX; }

        distanta[nod] = 0;
        for (int __nod = nod ; __nod <= dreapta ; __nod++) {
            if (distanta[__nod] != INT32_MAX) {
                for (auto& vecin : adiacenta[__nod][0])
                    { distanta[vecin.first] = min(distanta[vecin.first] , distanta[__nod] + vecin.second); }
            }
        }
        
        for (int __nod = nod ; __nod >= stanga ; __nod--) {
            if (distanta[__nod] != INT32_MAX) {
                for (auto& vecin : adiacenta[__nod][1]) {
                    { distanta[vecin.first] = min(distanta[vecin.first] , distanta[__nod] + vecin.second); }
                }
            }
        }

        for (auto& intrebare : actual) {
            if (distanta[intrebare.first] != INT32_MAX && distanta[intrebare.second.first] != INT32_MAX)
                { rezultat[intrebare.second.second] = min(rezultat[intrebare.second.second] , distanta[intrebare.first] + distanta[intrebare.second.first]); }
        }
    }

    for (auto& intrebare : actual) {
        if (rezultat[intrebare.second.second] == INT32_MAX)
            { rezultat[intrebare.second.second] = -1; }
    }
}

int main ()
{
    ios :: sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    int factor , numar_noduri , numar_muchii , numar_intrebari;
    cin >> factor >> numar_noduri >> numar_muchii >> numar_intrebari;

    numar_noduri = ((numar_noduri - 1) / factor + 1) * factor;
    while (numar_muchii--)
    {
        int nod[2] , cost;
        cin >> nod[0] >> nod[1] >> cost;
        adiacenta[nod[0]][0].emplace_back(nod[1] , cost);
        adiacenta[nod[1]][1].emplace_back(nod[0] , cost);
    }

    for (int indice = 1 ; indice <= numar_intrebari ; indice++)
    {
        int nod[2]; cin >> nod[0] >> nod[1];
        intrebari[nod[0]].emplace_back(nod[1] , indice);
    }

    Divide(0 , numar_noduri - 1 , factor);

    for (int indice = 1 ; indice <= numar_intrebari ; indice++)
        { cout << rezultat[indice] << '\n'; }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...