160782025-03-30 19:38:28szilAutópálya inflációcpp17Időlimit túllépés 36/1002.099s3780 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 = 30;
const int BLOCK_SIZE = 30;

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] &= ~(1ll << (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] &= ~(1ll << 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--) {
            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++) {
            bigint new_dist = dist_last[u[j]] + w[j];
            if (vis[u[j]] && new_dist < 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++) {
            bigint new_dist = dist_last[v[j]] + w[j];
            if (vis[v[j]] && new_dist < dist_curr[u[j]]) {
                dist_curr[u[j]] = new_dist;
                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.092s3636 KiB
subtask20/8
3Időlimit túllépés2.086s2880 KiB
4Időlimit túllépés2.088s2912 KiB
5Időlimit túllépés2.088s2912 KiB
6Időlimit túllépés2.088s2868 KiB
7Időlimit túllépés2.085s2916 KiB
subtask315/15
8Elfogadva1ms508 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.099s3772 KiB
20Időlimit túllépés2.099s3748 KiB
21Időlimit túllépés2.099s3760 KiB
22Időlimit túllépés2.099s3772 KiB
23Időlimit túllépés2.079s3636 KiB
24Időlimit túllépés2.082s3768 KiB
25Időlimit túllépés2.082s3644 KiB
26Időlimit túllépés2.082s3648 KiB
27Időlimit túllépés2.081s3636 KiB
28Időlimit túllépés2.084s2928 KiB
29Időlimit túllépés2.084s2924 KiB
30Időlimit túllépés2.084s2752 KiB
31Időlimit túllépés2.085s3060 KiB
32Időlimit túllépés2.086s3748 KiB
33Időlimit túllépés2.088s3764 KiB
subtask521/21
34Elfogadva187ms820 KiB
35Elfogadva354ms1280 KiB
36Elfogadva354ms1076 KiB
37Elfogadva354ms1080 KiB
38Elfogadva351ms1276 KiB
39Elfogadva354ms1276 KiB
40Elfogadva342ms1268 KiB
41Elfogadva342ms1280 KiB
42Elfogadva104ms820 KiB
43Elfogadva104ms852 KiB
44Elfogadva104ms1004 KiB
45Elfogadva104ms860 KiB
46Elfogadva104ms836 KiB
47Elfogadva98ms836 KiB
48Elfogadva181ms820 KiB
49Elfogadva181ms824 KiB
subtask60/22
50Időlimit túllépés2.085s3780 KiB
51Időlimit túllépés2.085s3756 KiB
52Időlimit túllépés2.085s3636 KiB
53Időlimit túllépés2.085s3636 KiB
54Időlimit túllépés2.079s3780 KiB
55Időlimit túllépés2.079s3780 KiB
56Időlimit túllépés2.079s3636 KiB
57Időlimit túllépés2.081s3636 KiB
58Hibás válasz423ms1276 KiB
59Időlimit túllépés2.081s2928 KiB
60Időlimit túllépés2.082s2924 KiB
61Időlimit túllépés2.081s2924 KiB
62Időlimit túllépés2.088s2884 KiB
63Időlimit túllépés2.085s3108 KiB
64Időlimit túllépés2.085s3764 KiB
65Időlimit túllépés2.086s3760 KiB
66Időlimit túllépés2.082s3732 KiB