155562025-02-20 12:31:18AblablablaAutópálya inflációcpp17Time limit exceeded 78/1002.099s1912 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(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    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
2Accepted98ms1132 KiB
subtask28/8
3Accepted39ms1060 KiB
4Accepted111ms1012 KiB
5Accepted32ms820 KiB
6Accepted19ms1076 KiB
7Accepted134ms1024 KiB
subtask315/15
8Accepted1ms316 KiB
9Accepted1ms316 KiB
10Accepted1ms316 KiB
11Accepted1ms316 KiB
12Accepted1ms316 KiB
13Accepted1ms316 KiB
14Accepted1ms316 KiB
15Accepted1ms316 KiB
16Accepted1ms316 KiB
17Accepted1ms316 KiB
18Accepted1ms316 KiB
subtask434/34
19Accepted75ms1072 KiB
20Accepted328ms912 KiB
21Accepted384ms1076 KiB
22Accepted190ms968 KiB
23Accepted177ms1076 KiB
24Accepted500ms1072 KiB
25Accepted43ms1076 KiB
26Accepted27ms1316 KiB
27Accepted540ms856 KiB
28Accepted101ms1128 KiB
29Accepted120ms820 KiB
30Accepted316ms844 KiB
31Accepted228ms820 KiB
32Accepted814ms1072 KiB
33Accepted816ms900 KiB
subtask521/21
34Accepted8ms316 KiB
35Accepted28ms564 KiB
36Accepted21ms568 KiB
37Accepted21ms756 KiB
38Accepted14ms564 KiB
39Accepted14ms564 KiB
40Accepted476ms596 KiB
41Accepted407ms556 KiB
42Accepted4ms316 KiB
43Accepted6ms316 KiB
44Accepted6ms508 KiB
45Accepted6ms492 KiB
46Accepted4ms316 KiB
47Accepted8ms316 KiB
48Accepted13ms316 KiB
49Accepted13ms476 KiB
subtask60/22
50Accepted81ms1084 KiB
51Accepted94ms1268 KiB
52Accepted101ms1076 KiB
53Accepted81ms1076 KiB
54Accepted35ms1260 KiB
55Accepted35ms1268 KiB
56Time limit exceeded2.099s1912 KiB
57Time limit exceeded2.099s1904 KiB
58Accepted21ms564 KiB
59Accepted45ms948 KiB
60Accepted54ms904 KiB
61Accepted71ms820 KiB
62Accepted64ms820 KiB
63Accepted52ms820 KiB
64Accepted307ms1080 KiB
65Accepted307ms908 KiB
66Accepted962ms820 KiB