160832025-03-30 20:12:30szilAutópálya inflációcpp17Időlimit túllépés 36/1002.099s6032 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const ll MOD = 1e9+7;
const int MAXN = 3001;
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] &= ~(1ull << (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] &= ~(1ull << 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--) {
            data[i] %= MOD;
            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);
    vector<bool> vis_last(n+1);
    dist_last[1].clear();
    vis_last[1] = 1;
    int is_ok = -1;
    for (int i = 1; i <= n; i++) {

        if (is_ok != -1 && is_ok + 40 < i) break;

        bool ok = true;
        for (int j = 1; j <= n; j++) {
            if (!vis_last[j]) ok = false;
        }
        if (ok && is_ok == -1) {
            is_ok = i;
        }

        vector<bigint> dist_curr = dist_last;
        vector<bool> vis_curr = vis_last;
        for (int j = 1; j <= m; j++) {
            if (vis_last[u[j]] && dist_last[u[j]] + w[j] < dist_curr[v[j]]) {
                dist_curr[v[j]] = dist_last[u[j]] + w[j];
                vis_curr[v[j]] = 1;
            }
        }
        for (int j = 1; j <= m; j++) {
            if (vis_last[v[j]] && dist_last[v[j]] + w[j] < dist_curr[u[j]]) {
                dist_curr[u[j]] = dist_last[v[j]] + w[j];
                vis_curr[u[j]] = 1;
            }
        }

        dist_last = dist_curr;
        vis_last = vis_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
1Elfogadva1ms508 KiB
2Elfogadva316ms5940 KiB
subtask20/8
3Elfogadva163ms4624 KiB
4Elfogadva246ms4604 KiB
5Elfogadva287ms4404 KiB
6Elfogadva131ms4596 KiB
7Időlimit túllépés2.082s4416 KiB
subtask315/15
8Elfogadva1ms316 KiB
9Elfogadva1ms508 KiB
10Elfogadva1ms496 KiB
11Elfogadva1ms500 KiB
12Elfogadva1ms388 KiB
13Elfogadva1ms316 KiB
14Elfogadva1ms580 KiB
15Elfogadva1ms508 KiB
16Elfogadva1ms316 KiB
17Elfogadva1ms316 KiB
18Elfogadva1ms316 KiB
subtask40/34
19Elfogadva282ms5784 KiB
20Elfogadva397ms6016 KiB
21Elfogadva370ms6024 KiB
22Elfogadva307ms6020 KiB
23Elfogadva293ms5940 KiB
24Elfogadva711ms5940 KiB
25Elfogadva263ms5940 KiB
26Elfogadva289ms5808 KiB
27Időlimit túllépés2.082s5940 KiB
28Elfogadva584ms4408 KiB
29Elfogadva879ms4404 KiB
30Időlimit túllépés2.082s4148 KiB
31Elfogadva712ms4404 KiB
32Elfogadva1.462s5948 KiB
33Elfogadva1.519s6008 KiB
subtask521/21
34Elfogadva104ms1332 KiB
35Elfogadva78ms1832 KiB
36Elfogadva68ms1588 KiB
37Elfogadva68ms1588 KiB
38Elfogadva67ms1832 KiB
39Elfogadva65ms1824 KiB
40Elfogadva166ms1588 KiB
41Elfogadva165ms1588 KiB
42Elfogadva39ms1076 KiB
43Elfogadva82ms1080 KiB
44Elfogadva79ms1076 KiB
45Elfogadva79ms1124 KiB
46Elfogadva48ms1076 KiB
47Elfogadva46ms1076 KiB
48Elfogadva61ms1336 KiB
49Elfogadva61ms1340 KiB
subtask60/22
50Elfogadva1.008s5940 KiB
51Elfogadva323ms5988 KiB
52Elfogadva284ms5940 KiB
53Elfogadva286ms6032 KiB
54Elfogadva280ms6020 KiB
55Elfogadva238ms5996 KiB
56Időlimit túllépés2.099s5940 KiB
57Időlimit túllépés2.088s5940 KiB
58Elfogadva300ms1588 KiB
59Elfogadva676ms4404 KiB
60Elfogadva797ms4404 KiB
61Elfogadva1.047s4596 KiB
62Elfogadva1.478s4564 KiB
63Elfogadva620ms4404 KiB
64Elfogadva1.475s6008 KiB
65Elfogadva1.542s6004 KiB
66Időlimit túllépés2.075s5940 KiB