160852025-03-30 20:27:23szilAutópálya inflációcpp17Időlimit túllépés 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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva1ms316 KiB
2Időlimit túllépés2.092s5980 KiB
subtask20/8
3Időlimit túllépés2.084s4404 KiB
4Időlimit túllépés2.082s4404 KiB
5Időlimit túllépés2.082s4404 KiB
6Időlimit túllépés2.084s4404 KiB
7Időlimit túllépés2.072s4404 KiB
subtask315/15
8Elfogadva1ms508 KiB
9Elfogadva1ms316 KiB
10Elfogadva1ms316 KiB
11Elfogadva1ms500 KiB
12Elfogadva1ms316 KiB
13Elfogadva1ms316 KiB
14Elfogadva1ms316 KiB
15Elfogadva1ms316 KiB
16Elfogadva1ms316 KiB
17Elfogadva1ms316 KiB
18Elfogadva1ms316 KiB
subtask40/34
19Időlimit túllépés2.099s5940 KiB
20Időlimit túllépés2.099s5788 KiB
21Időlimit túllépés2.099s5980 KiB
22Időlimit túllépés2.099s5940 KiB
23Időlimit túllépés2.094s5940 KiB
24Időlimit túllépés2.095s5880 KiB
25Időlimit túllépés2.096s5952 KiB
26Időlimit túllépés2.095s6028 KiB
27Időlimit túllépés2.085s5952 KiB
28Időlimit túllépés2.086s4404 KiB
29Időlimit túllépés2.086s4404 KiB
30Elfogadva1.856s4352 KiB
31Időlimit túllépés2.085s4404 KiB
32Időlimit túllépés2.079s6132 KiB
33Időlimit túllépés2.082s5940 KiB
subtask521/21
34Elfogadva90ms1516 KiB
35Elfogadva156ms1840 KiB
36Elfogadva158ms1828 KiB
37Elfogadva156ms1820 KiB
38Elfogadva155ms1588 KiB
39Elfogadva157ms1848 KiB
40Elfogadva156ms1824 KiB
41Elfogadva156ms1588 KiB
42Elfogadva59ms1076 KiB
43Elfogadva61ms1076 KiB
44Elfogadva59ms1120 KiB
45Elfogadva59ms1264 KiB
46Elfogadva59ms1124 KiB
47Elfogadva54ms1076 KiB
48Elfogadva89ms1332 KiB
49Elfogadva87ms1332 KiB
subtask60/22
50Időlimit túllépés2.078s5940 KiB
51Időlimit túllépés2.081s5940 KiB
52Időlimit túllépés2.078s5944 KiB
53Időlimit túllépés2.079s5940 KiB
54Időlimit túllépés2.081s6128 KiB
55Időlimit túllépés2.081s5940 KiB
56Időlimit túllépés2.081s5940 KiB
57Időlimit túllépés2.082s6132 KiB
58Elfogadva230ms1844 KiB
59Időlimit túllépés2.085s4404 KiB
60Időlimit túllépés2.085s4404 KiB
61Időlimit túllépés2.085s4600 KiB
62Időlimit túllépés2.084s4404 KiB
63Időlimit túllépés2.088s4588 KiB
64Időlimit túllépés2.088s5940 KiB
65Időlimit túllépés2.088s5940 KiB
66Időlimit túllépés2.085s5940 KiB