160852025-03-30 20:27:23szilAutópálya inflációcpp17Time limit exceeded 36/1002.099s6132 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++) {
            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
1Accepted1ms316 KiB
2Time limit exceeded2.092s5980 KiB
subtask20/8
3Time limit exceeded2.084s4404 KiB
4Time limit exceeded2.082s4404 KiB
5Time limit exceeded2.082s4404 KiB
6Time limit exceeded2.084s4404 KiB
7Time limit exceeded2.072s4404 KiB
subtask315/15
8Accepted1ms508 KiB
9Accepted1ms316 KiB
10Accepted1ms316 KiB
11Accepted1ms500 KiB
12Accepted1ms316 KiB
13Accepted1ms316 KiB
14Accepted1ms316 KiB
15Accepted1ms316 KiB
16Accepted1ms316 KiB
17Accepted1ms316 KiB
18Accepted1ms316 KiB
subtask40/34
19Time limit exceeded2.099s5940 KiB
20Time limit exceeded2.099s5788 KiB
21Time limit exceeded2.099s5980 KiB
22Time limit exceeded2.099s5940 KiB
23Time limit exceeded2.094s5940 KiB
24Time limit exceeded2.095s5880 KiB
25Time limit exceeded2.096s5952 KiB
26Time limit exceeded2.095s6028 KiB
27Time limit exceeded2.085s5952 KiB
28Time limit exceeded2.086s4404 KiB
29Time limit exceeded2.086s4404 KiB
30Accepted1.856s4352 KiB
31Time limit exceeded2.085s4404 KiB
32Time limit exceeded2.079s6132 KiB
33Time limit exceeded2.082s5940 KiB
subtask521/21
34Accepted90ms1516 KiB
35Accepted156ms1840 KiB
36Accepted158ms1828 KiB
37Accepted156ms1820 KiB
38Accepted155ms1588 KiB
39Accepted157ms1848 KiB
40Accepted156ms1824 KiB
41Accepted156ms1588 KiB
42Accepted59ms1076 KiB
43Accepted61ms1076 KiB
44Accepted59ms1120 KiB
45Accepted59ms1264 KiB
46Accepted59ms1124 KiB
47Accepted54ms1076 KiB
48Accepted89ms1332 KiB
49Accepted87ms1332 KiB
subtask60/22
50Time limit exceeded2.078s5940 KiB
51Time limit exceeded2.081s5940 KiB
52Time limit exceeded2.078s5944 KiB
53Time limit exceeded2.079s5940 KiB
54Time limit exceeded2.081s6128 KiB
55Time limit exceeded2.081s5940 KiB
56Time limit exceeded2.081s5940 KiB
57Time limit exceeded2.082s6132 KiB
58Accepted230ms1844 KiB
59Time limit exceeded2.085s4404 KiB
60Time limit exceeded2.085s4404 KiB
61Time limit exceeded2.085s4600 KiB
62Time limit exceeded2.084s4404 KiB
63Time limit exceeded2.088s4588 KiB
64Time limit exceeded2.088s5940 KiB
65Time limit exceeded2.088s5940 KiB
66Time limit exceeded2.085s5940 KiB