160862025-03-30 20:28:50szilAutópálya inflációcpp17Time limit exceeded 78/1002.086s6132 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<int> first_seen(n+1, n);
    vector<bool> vis_last(n+1);
    dist_last[1].clear();
    vis_last[1] = 1;
    int is_ok = -1;
    first_seen[1] = 0;
    for (int i = 1; i <= n; i++) {

        vector<bigint> dist_curr = dist_last;
        vector<bool> vis_curr = vis_last;
        for (int j = 1; j <= m; j++) {
            if (first_seen[u[j]] + 35 >= i && first_seen[v[j]] + 35 >= i && 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;
                first_seen[v[j]] = min(first_seen[v[j]], i);
            }
        }
        for (int j = 1; j <= m; j++) {
            if (first_seen[u[j]] + 35 >= i && first_seen[v[j]] + 35 >= i && 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;
                first_seen[u[j]] = min(first_seen[u[j]], i);
            }
        }

        dist_last = dist_curr;
        vis_last = vis_curr;

        for (int j = 1; j <= m; j++) {
            if (first_seen[u[j]] + 35 >= i && first_seen[v[j]] + 35 >= i) 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;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted1ms508 KiB
2Accepted1.519s5940 KiB
subtask28/8
3Accepted1.376s4596 KiB
4Accepted1.396s4500 KiB
5Accepted1.391s4652 KiB
6Accepted1.378s4404 KiB
7Accepted1.748s4652 KiB
subtask315/15
8Accepted1ms316 KiB
9Accepted1ms316 KiB
10Accepted1ms508 KiB
11Accepted1ms316 KiB
12Accepted1ms316 KiB
13Accepted1ms316 KiB
14Accepted1ms432 KiB
15Accepted1ms316 KiB
16Accepted1ms316 KiB
17Accepted1ms316 KiB
18Accepted1ms316 KiB
subtask434/34
19Accepted1.529s5900 KiB
20Accepted1.616s6048 KiB
21Accepted1.638s6036 KiB
22Accepted1.549s6036 KiB
23Accepted1.625s5940 KiB
24Accepted1.669s6036 KiB
25Accepted1.559s5940 KiB
26Accepted1.57s6036 KiB
27Accepted1.901s6132 KiB
28Accepted1.429s4620 KiB
29Accepted1.432s4588 KiB
30Accepted1.457s4340 KiB
31Accepted1.434s4608 KiB
32Accepted1.723s6016 KiB
33Accepted1.733s6020 KiB
subtask521/21
34Accepted68ms1524 KiB
35Accepted85ms1588 KiB
36Accepted82ms1836 KiB
37Accepted82ms1832 KiB
38Accepted82ms1588 KiB
39Accepted82ms1828 KiB
40Accepted92ms1828 KiB
41Accepted93ms1588 KiB
42Accepted43ms1076 KiB
43Accepted48ms1124 KiB
44Accepted48ms1116 KiB
45Accepted48ms1120 KiB
46Accepted43ms1120 KiB
47Accepted41ms1088 KiB
48Accepted59ms1344 KiB
49Accepted59ms1340 KiB
subtask60/22
50Accepted1.713s6132 KiB
51Accepted1.544s5940 KiB
52Accepted1.534s6132 KiB
53Accepted1.605s6032 KiB
54Accepted1.536s5940 KiB
55Accepted1.527s5940 KiB
56Accepted1.98s5940 KiB
57Time limit exceeded2.007s5940 KiB
58Accepted172ms1588 KiB
59Accepted1.445s4632 KiB
60Accepted1.419s4620 KiB
61Accepted1.473s4404 KiB
62Accepted1.504s4408 KiB
63Accepted1.399s4408 KiB
64Accepted1.69s6012 KiB
65Accepted1.751s5940 KiB
66Time limit exceeded2.086s5940 KiB