160862025-03-30 20:28:50szilAutópálya inflációcpp17Időlimit túllépés 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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva1ms508 KiB
2Elfogadva1.519s5940 KiB
subtask28/8
3Elfogadva1.376s4596 KiB
4Elfogadva1.396s4500 KiB
5Elfogadva1.391s4652 KiB
6Elfogadva1.378s4404 KiB
7Elfogadva1.748s4652 KiB
subtask315/15
8Elfogadva1ms316 KiB
9Elfogadva1ms316 KiB
10Elfogadva1ms508 KiB
11Elfogadva1ms316 KiB
12Elfogadva1ms316 KiB
13Elfogadva1ms316 KiB
14Elfogadva1ms432 KiB
15Elfogadva1ms316 KiB
16Elfogadva1ms316 KiB
17Elfogadva1ms316 KiB
18Elfogadva1ms316 KiB
subtask434/34
19Elfogadva1.529s5900 KiB
20Elfogadva1.616s6048 KiB
21Elfogadva1.638s6036 KiB
22Elfogadva1.549s6036 KiB
23Elfogadva1.625s5940 KiB
24Elfogadva1.669s6036 KiB
25Elfogadva1.559s5940 KiB
26Elfogadva1.57s6036 KiB
27Elfogadva1.901s6132 KiB
28Elfogadva1.429s4620 KiB
29Elfogadva1.432s4588 KiB
30Elfogadva1.457s4340 KiB
31Elfogadva1.434s4608 KiB
32Elfogadva1.723s6016 KiB
33Elfogadva1.733s6020 KiB
subtask521/21
34Elfogadva68ms1524 KiB
35Elfogadva85ms1588 KiB
36Elfogadva82ms1836 KiB
37Elfogadva82ms1832 KiB
38Elfogadva82ms1588 KiB
39Elfogadva82ms1828 KiB
40Elfogadva92ms1828 KiB
41Elfogadva93ms1588 KiB
42Elfogadva43ms1076 KiB
43Elfogadva48ms1124 KiB
44Elfogadva48ms1116 KiB
45Elfogadva48ms1120 KiB
46Elfogadva43ms1120 KiB
47Elfogadva41ms1088 KiB
48Elfogadva59ms1344 KiB
49Elfogadva59ms1340 KiB
subtask60/22
50Elfogadva1.713s6132 KiB
51Elfogadva1.544s5940 KiB
52Elfogadva1.534s6132 KiB
53Elfogadva1.605s6032 KiB
54Elfogadva1.536s5940 KiB
55Elfogadva1.527s5940 KiB
56Elfogadva1.98s5940 KiB
57Időlimit túllépés2.007s5940 KiB
58Elfogadva172ms1588 KiB
59Elfogadva1.445s4632 KiB
60Elfogadva1.419s4620 KiB
61Elfogadva1.473s4404 KiB
62Elfogadva1.504s4408 KiB
63Elfogadva1.399s4408 KiB
64Elfogadva1.69s6012 KiB
65Elfogadva1.751s5940 KiB
66Időlimit túllépés2.086s5940 KiB