160742025-03-30 19:23:00szilAutópálya inflációcpp17Időlimit túllépés 15/1002.091s6236 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const ll MOD = 1e9+7;
const int MAXM = 6001;

const int BLOCK_CNT = 55;
const int BLOCK_SIZE = 60;

const ll MULTI = (1ll<<(1+BLOCK_SIZE))%MOD;

struct bigint {

    vector<uint64_t> data;

    bigint() {
        data.assign(BLOCK_CNT, ~0ull);
    }

    void clear() {
        data.assign(BLOCK_CNT, 0ull);
    }

    bool operator<(const bigint &rhs) {
        for (int i = 0; i < BLOCK_CNT; i++) {
            if (data[i] != rhs.data[i]) {
                return data[i] < rhs.data[i];
            }
        }
        return 0;
    }

    bigint operator+(const bigint &rhs) {
        bigint res;
        res.clear();
        bool carry = 0;
        for (int i = BLOCK_CNT-1; i >= 0; i--) {
            res.data[i] = data[i] + rhs.data[i] + carry;
            carry = (res.data[i] >> (BLOCK_SIZE + 1)) & 1;
            res.data[i] &= ~(1ll << (BLOCK_SIZE + 1));
        }

        return res;
    }

    void inflate() {
        bool carry = 0;
        for (int i = BLOCK_CNT-1; i >= 0; i--) {
            bool next_carry = (data[i] >> BLOCK_SIZE) & 1;
            data[i] &= ~(1ll << BLOCK_SIZE);
            data[i] <<= 1;
            data[i] |= carry;
            carry = next_carry;
        }
    }

    ll calc_ans() {
        ll ans = 0;
        ll mul = 1;
        for (int i = BLOCK_CNT-1; i >= 0; i--) {
            ans += data[i] * mul;
            ans %= MOD;
            mul *= MULTI;
            mul %= MOD;
        }
        return ans;
    }
};

int u[MAXM], v[MAXM];

void solve() {
    int n, m; cin >> n >> m;
    vector<bigint> w(m+1);
    for (int i = 1; i <= m; i++) {
        w[i].clear();
        cin >> u[i] >> v[i] >> w[i].data.back();
        // ll x;
        // cin >> u[i] >> v[i] >> x;
        // for (int j = BLOCK_CNT-1; j >= 0; j--) {
        //     w[i].data[j] = x & ((1ll<<(1+BLOCK_SIZE))-1);
        //     x >>= (1 + BLOCK_SIZE);
        // }
    }
    vector<bigint> dist_last(n+1);
    dist_last[1].clear();
    for (int i = 1; i <= m; i++) {
        vector<bigint> dist_curr = dist_last;
        for (int j = 1; j <= m; j++) {
            if (dist_last[u[j]] + w[j] < dist_curr[v[j]]) {
                dist_curr[v[j]] = dist_last[u[j]] + w[j];
            }
        }
        for (int j = 1; j <= m; j++) {
            if (dist_last[v[j]] + w[j] < dist_curr[u[j]]) {
                dist_curr[u[j]] = dist_last[v[j]] + w[j];
            }
        }

        dist_last = dist_curr;

        for (int j = 1; j <= m; j++) {
            w[j].inflate();
        }
    }

    for (int i = 2; i <= n; i++) {
        cout << dist_last[i].calc_ans() << "\n";
    }
    cout << "\n";
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int t = 1; 
    // cin >> t;
    while (t--) solve();
    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva1ms316 KiB
2Időlimit túllépés2.078s6016 KiB
subtask20/8
3Időlimit túllépés2.088s4596 KiB
4Időlimit túllépés2.088s4588 KiB
5Időlimit túllépés2.089s4596 KiB
6Időlimit túllépés2.089s4600 KiB
7Időlimit túllépés2.084s4608 KiB
subtask315/15
8Elfogadva1ms316 KiB
9Elfogadva1ms316 KiB
10Elfogadva2ms316 KiB
11Elfogadva1ms316 KiB
12Elfogadva1ms328 KiB
13Elfogadva1ms316 KiB
14Elfogadva1ms508 KiB
15Elfogadva1ms316 KiB
16Elfogadva1ms348 KiB
17Elfogadva1ms528 KiB
18Elfogadva1ms316 KiB
subtask40/34
19Időlimit túllépés2.078s6132 KiB
20Időlimit túllépés2.078s5940 KiB
21Időlimit túllépés2.078s5940 KiB
22Időlimit túllépés2.078s5992 KiB
23Időlimit túllépés2.082s6016 KiB
24Időlimit túllépés2.082s5940 KiB
25Időlimit túllépés2.084s5940 KiB
26Időlimit túllépés2.084s6132 KiB
27Időlimit túllépés2.079s5940 KiB
28Időlimit túllépés2.078s4612 KiB
29Időlimit túllépés2.078s4608 KiB
30Időlimit túllépés2.079s4148 KiB
31Időlimit túllépés2.084s4592 KiB
32Időlimit túllépés2.085s6236 KiB
33Időlimit túllépés2.085s6124 KiB
subtask50/21
34Hibás válasz694ms1524 KiB
35Időlimit túllépés2.085s1820 KiB
36Időlimit túllépés2.085s1772 KiB
37Időlimit túllépés2.085s1780 KiB
38Időlimit túllépés2.078s1588 KiB
39Időlimit túllépés2.088s1588 KiB
40Időlimit túllépés2.088s1588 KiB
41Időlimit túllépés2.088s1588 KiB
42Hibás válasz188ms1120 KiB
43Hibás válasz189ms1116 KiB
44Hibás válasz189ms1076 KiB
45Hibás válasz189ms1076 KiB
46Hibás válasz188ms1076 KiB
47Hibás válasz174ms1076 KiB
48Hibás válasz671ms1336 KiB
49Hibás válasz670ms1332 KiB
subtask60/22
50Időlimit túllépés2.081s6020 KiB
51Időlimit túllépés2.079s6020 KiB
52Időlimit túllépés2.081s5952 KiB
53Időlimit túllépés2.081s6072 KiB
54Időlimit túllépés2.091s6212 KiB
55Időlimit túllépés2.091s6068 KiB
56Időlimit túllépés2.091s5940 KiB
57Időlimit túllépés2.091s5940 KiB
58Hibás válasz792ms1820 KiB
59Időlimit túllépés2.085s4604 KiB
60Időlimit túllépés2.085s4600 KiB
61Időlimit túllépés2.085s4600 KiB
62Időlimit túllépés2.091s4568 KiB
63Időlimit túllépés2.078s4572 KiB
64Időlimit túllépés2.081s6156 KiB
65Időlimit túllépés2.081s6004 KiB
66Időlimit túllépés2.088s5940 KiB