155552025-02-20 12:29:44AblablablaAutópálya inflációcpp17Time limit exceeded 78/1002.099s1888 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll MOD = 1e9 + 7;

struct pont{
    int akt, elozo, ind, suly, hossz;
};

vector<vector<vector<int>>> utak; // elozo, ind, suly, hossz

ll kulonbseg(pont elso, pont masod){
    int egy = elso.hossz, ket = masod.hossz;
    ll kul = 0; // a - b

    int a = elso.elozo, b = elso.ind, c = masod.elozo, d = masod.ind;

    while(egy > 0 || ket > 0){
        vector<int> akt1 = utak[a][b], akt2 = utak[c][d];

        if(egy > ket){ // egyben messzebb vagyunk
            kul = (kul - elso.suly)*2 - akt1[2];

            elso.suly = 0;
            a = akt1[0];
            b = akt1[1];
            egy--;
        } else if(egy < ket){
            kul = (kul + masod.suly)*2 + akt2[2];

            masod.suly = 0;
            c = akt2[0];
            d = akt2[1];
            ket--;
        } else{
            kul = (kul - elso.suly + masod.suly)*2 - akt1[2] + akt2[2];

            elso.suly = 0;
            a = akt1[0];
            b = akt1[1];
            egy--;

            masod.suly = 0;
            c = akt2[0];
            d = akt2[1];
            ket--;
        }

        if(kul < -2e9 || 2e9 < kul) return kul;
    }

    kul += masod.suly - elso.suly;

    return kul;
}

struct comp{
    bool operator()(pont a, pont b){
        ll c = kulonbseg(a, b);

        if(c < 0){ // a - b < 0
            return 1;
        } else if(c > 0){
            return 0;
        } else{
            return a.hossz > b.hossz;
        }
    }
};

ll leker(int akt, int ind){
    ll vissza = 0;

    while(akt != 0){

        //cout << akt << " " << ind << "\n";
        vector<int> egy = utak[akt][ind];

        vissza = ((vissza*2) % MOD + egy[2]) % MOD;

        akt = egy[0];
        ind = egy[1];
    }

    return vissza;
}

int main(){
    int n, m;
    cin >> n >> m;

    vector<vector<int>> csucsok(n, vector<int>()), elSuly(n, vector<int>());
    for(int i = 0; i < m; i++){
        int a, b, c;
        cin >> a >> b >> c;
        a--; b--;

        csucsok[a].push_back(b);
        elSuly[a].push_back(c);
        csucsok[b].push_back(a);
        elSuly[b].push_back(c);
    }


    priority_queue<pont, vector<pont>, comp> bejar;
    bejar.push({0, 0, 0, 0, 0});

    utak.assign(n, vector<vector<int>>());

    vector<int> ans(n, 0);

    while(!bejar.empty()){
        pont egy = bejar.top();
        bejar.pop();

        int akt = egy.akt;
        //cout << akt << "\n";

        if(!utak[akt].empty() && utak[akt].back()[3] <= egy.hossz) continue;

        //cout << "atjut\n";

        utak[akt].push_back({egy.elozo, egy.ind, egy.suly, egy.hossz});

        if(utak[akt].size() == 1){
            ans[akt] = leker(akt, 0);
            //cout << akt << " " << ans[akt] << "\n";
        }

        for(int i = 0; i < csucsok[akt].size(); i++){
            bejar.push({csucsok[akt][i], akt, utak[akt].size() - 1, elSuly[akt][i], egy.hossz + 1});
        }
    }

    for(int i = 1; i < n; i++){
        cout << ans[i] << "\n";
    }
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted1ms316 KiB
2Accepted109ms1188 KiB
subtask28/8
3Accepted43ms820 KiB
4Accepted123ms820 KiB
5Accepted37ms908 KiB
6Accepted24ms1000 KiB
7Accepted149ms824 KiB
subtask315/15
8Accepted1ms316 KiB
9Accepted1ms316 KiB
10Accepted1ms316 KiB
11Accepted1ms316 KiB
12Accepted1ms316 KiB
13Accepted1ms328 KiB
14Accepted1ms316 KiB
15Accepted1ms316 KiB
16Accepted1ms316 KiB
17Accepted1ms332 KiB
18Accepted1ms316 KiB
subtask434/34
19Accepted86ms908 KiB
20Accepted361ms928 KiB
21Accepted425ms916 KiB
22Accepted209ms988 KiB
23Accepted194ms1136 KiB
24Accepted541ms1076 KiB
25Accepted50ms1080 KiB
26Accepted32ms1232 KiB
27Accepted597ms820 KiB
28Accepted112ms864 KiB
29Accepted134ms820 KiB
30Accepted351ms820 KiB
31Accepted250ms1012 KiB
32Accepted885ms888 KiB
33Accepted893ms820 KiB
subtask521/21
34Accepted8ms508 KiB
35Accepted32ms564 KiB
36Accepted25ms564 KiB
37Accepted25ms576 KiB
38Accepted17ms564 KiB
39Accepted17ms564 KiB
40Accepted523ms616 KiB
41Accepted449ms564 KiB
42Accepted4ms316 KiB
43Accepted7ms316 KiB
44Accepted7ms316 KiB
45Accepted7ms316 KiB
46Accepted6ms316 KiB
47Accepted8ms316 KiB
48Accepted14ms316 KiB
49Accepted14ms496 KiB
subtask60/22
50Accepted87ms1080 KiB
51Accepted105ms1080 KiB
52Accepted112ms972 KiB
53Accepted90ms1076 KiB
54Accepted41ms1076 KiB
55Accepted41ms1260 KiB
56Time limit exceeded2.099s1800 KiB
57Time limit exceeded2.099s1888 KiB
58Accepted25ms564 KiB
59Accepted50ms820 KiB
60Accepted59ms820 KiB
61Accepted79ms820 KiB
62Accepted71ms820 KiB
63Accepted59ms820 KiB
64Accepted340ms820 KiB
65Accepted335ms820 KiB
66Accepted1.057s820 KiB