160792025-03-30 19:59:22szilAutópálya inflációcpp17Időlimit túllépés 36/1002.099s6284 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];
bool vis[MAXN];

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();
        // ll x;
        // cin >> u[i] >> v[i] >> x;
        // for (int j = BLOCK_CNT-1; j >= 0; j--) {
        //     w[i].data[j] = x & ((1ll<<(1+BLOCK_SIZE))-1);
        //     x >>= (1 + BLOCK_SIZE);
        // }
    }
    vector<bigint> dist_last(n+1);
    dist_last[1].clear();
    vis[1] = 1;
    for (int i = 1; i <= n; i++) {
        vector<bigint> dist_curr = dist_last;
        for (int j = 1; j <= m; j++) {
            if (vis[u[j]] && dist_last[u[j]] + w[j] < dist_curr[v[j]]) {
                dist_curr[v[j]] = dist_last[u[j]] + w[j];
                vis[v[j]] = 1;
            }
        }
        for (int j = 1; j <= m; j++) {
            if (vis[v[j]] && dist_last[v[j]] + w[j] < dist_curr[u[j]]) {
                dist_curr[u[j]] = dist_last[v[j]] + w[j];
                vis[u[j]] = 1;
            }
        }

        dist_last = dist_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.092s6084 KiB
subtask20/8
3Időlimit túllépés2.071s4804 KiB
4Időlimit túllépés2.071s4808 KiB
5Időlimit túllépés2.071s4612 KiB
6Időlimit túllépés2.071s4608 KiB
7Időlimit túllépés2.076s4804 KiB
subtask315/15
8Elfogadva1ms316 KiB
9Elfogadva1ms316 KiB
10Elfogadva1ms316 KiB
11Elfogadva1ms508 KiB
12Elfogadva1ms316 KiB
13Elfogadva1ms316 KiB
14Elfogadva1ms316 KiB
15Elfogadva1ms316 KiB
16Elfogadva1ms316 KiB
17Elfogadva1ms316 KiB
18Elfogadva1ms316 KiB
subtask40/34
19Időlimit túllépés2.099s5984 KiB
20Időlimit túllépés2.098s6040 KiB
21Időlimit túllépés2.099s6028 KiB
22Időlimit túllépés2.099s5956 KiB
23Időlimit túllépés2.079s6024 KiB
24Időlimit túllépés2.081s6036 KiB
25Időlimit túllépés2.081s5964 KiB
26Időlimit túllépés2.082s6036 KiB
27Időlimit túllépés2.081s5940 KiB
28Időlimit túllépés2.082s4608 KiB
29Időlimit túllépés2.082s4604 KiB
30Időlimit túllépés2.084s4176 KiB
31Időlimit túllépés2.092s4604 KiB
32Időlimit túllépés2.092s6008 KiB
33Időlimit túllépés2.095s6012 KiB
subtask521/21
34Elfogadva342ms1364 KiB
35Elfogadva709ms1836 KiB
36Elfogadva712ms1844 KiB
37Elfogadva717ms1844 KiB
38Elfogadva714ms1844 KiB
39Elfogadva716ms1844 KiB
40Elfogadva708ms1844 KiB
41Elfogadva705ms1844 KiB
42Elfogadva187ms1076 KiB
43Elfogadva177ms1076 KiB
44Elfogadva179ms1076 KiB
45Elfogadva177ms1132 KiB
46Elfogadva186ms1140 KiB
47Elfogadva172ms1076 KiB
48Elfogadva342ms1332 KiB
49Elfogadva338ms1336 KiB
subtask60/22
50Időlimit túllépés2.088s6164 KiB
51Időlimit túllépés2.088s6284 KiB
52Időlimit túllépés2.088s6028 KiB
53Időlimit túllépés2.088s5960 KiB
54Időlimit túllépés2.078s6028 KiB
55Időlimit túllépés2.079s6044 KiB
56Időlimit túllépés2.079s6004 KiB
57Időlimit túllépés2.081s5940 KiB
58Elfogadva748ms1832 KiB
59Időlimit túllépés2.089s4620 KiB
60Időlimit túllépés2.089s4748 KiB
61Időlimit túllépés2.092s4616 KiB
62Időlimit túllépés2.078s4404 KiB
63Időlimit túllépés2.078s4580 KiB
64Időlimit túllépés2.081s6016 KiB
65Időlimit túllépés2.082s6004 KiB
66Időlimit túllépés2.089s5940 KiB