160752025-03-30 19:26:03szilAutópálya inflációcpp17Időlimit túllépés 15/1002.099s6260 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] &= ~(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++) {
            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
1Elfogadva1ms508 KiB
2Időlimit túllépés2.079s6048 KiB
subtask20/8
3Időlimit túllépés2.078s4604 KiB
4Időlimit túllépés2.078s4796 KiB
5Időlimit túllépés2.078s4608 KiB
6Időlimit túllépés2.078s4612 KiB
7Időlimit túllépés2.079s4608 KiB
subtask315/15
8Elfogadva1ms316 KiB
9Elfogadva1ms316 KiB
10Elfogadva1ms316 KiB
11Elfogadva1ms316 KiB
12Elfogadva1ms424 KiB
13Elfogadva1ms316 KiB
14Elfogadva1ms316 KiB
15Elfogadva1ms316 KiB
16Elfogadva1ms316 KiB
17Elfogadva1ms316 KiB
18Elfogadva1ms316 KiB
subtask40/34
19Időlimit túllépés2.099s6024 KiB
20Időlimit túllépés2.099s6024 KiB
21Időlimit túllépés2.099s6028 KiB
22Időlimit túllépés2.099s5956 KiB
23Időlimit túllépés2.081s6032 KiB
24Időlimit túllépés2.081s6184 KiB
25Időlimit túllépés2.081s5968 KiB
26Időlimit túllépés2.082s6024 KiB
27Időlimit túllépés2.088s5952 KiB
28Időlimit túllépés2.086s4608 KiB
29Időlimit túllépés2.088s4816 KiB
30Időlimit túllépés2.088s4176 KiB
31Időlimit túllépés2.091s4792 KiB
32Időlimit túllépés2.091s6020 KiB
33Időlimit túllépés2.091s6012 KiB
subtask50/21
34Hibás válasz335ms1372 KiB
35Elfogadva691ms1836 KiB
36Elfogadva694ms1588 KiB
37Elfogadva694ms1836 KiB
38Elfogadva694ms1844 KiB
39Elfogadva695ms1840 KiB
40Hibás válasz688ms1844 KiB
41Hibás válasz689ms1836 KiB
42Hibás válasz182ms1076 KiB
43Hibás válasz173ms1140 KiB
44Hibás válasz173ms1136 KiB
45Hibás válasz174ms1132 KiB
46Hibás válasz182ms1128 KiB
47Hibás válasz167ms1268 KiB
48Hibás válasz331ms1332 KiB
49Hibás válasz333ms1360 KiB
subtask60/22
50Időlimit túllépés2.078s6164 KiB
51Időlimit túllépés2.079s6032 KiB
52Időlimit túllépés2.078s6000 KiB
53Időlimit túllépés2.078s6208 KiB
54Időlimit túllépés2.085s6028 KiB
55Időlimit túllépés2.085s6220 KiB
56Időlimit túllépés2.085s5952 KiB
57Időlimit túllépés2.086s5940 KiB
58Hibás válasz736ms1828 KiB
59Időlimit túllépés2.082s4612 KiB
60Időlimit túllépés2.082s4612 KiB
61Időlimit túllépés2.085s4632 KiB
62Időlimit túllépés2.082s4404 KiB
63Időlimit túllépés2.078s4584 KiB
64Időlimit túllépés2.079s6260 KiB
65Időlimit túllépés2.079s6216 KiB
66Időlimit túllépés2.092s5940 KiB