160732025-03-30 19:17:12szilAutópálya inflációcpp17Időlimit túllépés 15/1002.101s5820 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 = 50;
const int BLOCK_SIZE = 62;

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();
    }
    vector<bigint> dist_last(n+1);
    dist_last[1].clear();
    for (int i = 1; i <= n; 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.086s5688 KiB
subtask20/8
3Időlimit túllépés2.088s4312 KiB
4Időlimit túllépés2.088s4320 KiB
5Időlimit túllépés2.088s4332 KiB
6Időlimit túllépés2.088s4316 KiB
7Időlimit túllépés2.075s4316 KiB
subtask315/15
8Elfogadva1ms316 KiB
9Elfogadva1ms316 KiB
10Elfogadva1ms316 KiB
11Elfogadva1ms316 KiB
12Elfogadva1ms328 KiB
13Elfogadva1ms316 KiB
14Elfogadva1ms316 KiB
15Elfogadva1ms316 KiB
16Elfogadva1ms316 KiB
17Elfogadva1ms316 KiB
18Elfogadva1ms316 KiB
subtask40/34
19Időlimit túllépés2.099s5432 KiB
20Időlimit túllépés2.099s5428 KiB
21Időlimit túllépés2.101s5652 KiB
22Időlimit túllépés2.099s5644 KiB
23Időlimit túllépés2.082s5644 KiB
24Időlimit túllépés2.082s5620 KiB
25Időlimit túllépés2.082s5428 KiB
26Időlimit túllépés2.084s5820 KiB
27Időlimit túllépés2.075s5428 KiB
28Időlimit túllépés2.073s4340 KiB
29Időlimit túllépés2.075s4148 KiB
30Időlimit túllépés2.075s3892 KiB
31Időlimit túllépés2.092s4304 KiB
32Időlimit túllépés2.092s5628 KiB
33Időlimit túllépés2.092s5628 KiB
subtask50/21
34Hibás válasz293ms1076 KiB
35Elfogadva574ms1588 KiB
36Elfogadva573ms1588 KiB
37Elfogadva572ms1780 KiB
38Elfogadva573ms1588 KiB
39Elfogadva574ms1736 KiB
40Hibás válasz563ms1784 KiB
41Hibás válasz564ms1588 KiB
42Hibás válasz157ms820 KiB
43Hibás válasz159ms1076 KiB
44Hibás válasz159ms1260 KiB
45Hibás válasz160ms1072 KiB
46Hibás válasz158ms1068 KiB
47Hibás válasz146ms820 KiB
48Hibás válasz284ms1280 KiB
49Hibás válasz284ms1076 KiB
subtask60/22
50Időlimit túllépés2.088s5644 KiB
51Időlimit túllépés2.088s5660 KiB
52Időlimit túllépés2.089s5612 KiB
53Időlimit túllépés2.089s5644 KiB
54Időlimit túllépés2.086s5656 KiB
55Időlimit túllépés2.086s5644 KiB
56Időlimit túllépés2.088s5660 KiB
57Időlimit túllépés2.088s5428 KiB
58Hibás válasz675ms1780 KiB
59Időlimit túllépés2.088s4516 KiB
60Időlimit túllépés2.091s4316 KiB
61Időlimit túllépés2.091s4316 KiB
62Időlimit túllépés2.092s4280 KiB
63Időlimit túllépés2.085s4292 KiB
64Időlimit túllépés2.088s5660 KiB
65Időlimit túllépés2.088s5624 KiB
66Időlimit túllépés2.082s5428 KiB