160702025-03-30 19:09:45szilAutópálya inflációcpp17Futási hiba 15/1002.099s4444 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const ll MOD = 1e9+7;
const int MAXM = 3001;

const int BLOCK_CNT = 50;
const int BLOCK_SIZE = 62;

const ll MULTI = (1ll<<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];
            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);
    dist_last[1].clear();
    for (int i = 1; i <= n; i++) {
        vector<bigint> dist_curr = dist_last;
        for (int j = 1; j <= m; j++) {
            if (dist_last[u[j]] + w[j] < dist_curr[v[j]]) {
                dist_curr[v[j]] = dist_last[u[j]] + w[j];
            }
        }
        for (int j = 1; j <= m; j++) {
            if (dist_last[v[j]] + w[j] < dist_curr[u[j]]) {
                dist_curr[u[j]] = dist_last[v[j]] + w[j];
            }
        }

        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
2Futási hiba4ms2880 KiB
subtask20/8
3Időlimit túllépés2.075s4316 KiB
4Időlimit túllépés2.075s4320 KiB
5Időlimit túllépés2.075s4316 KiB
6Időlimit túllépés2.075s4340 KiB
7Időlimit túllépés2.079s4312 KiB
subtask315/15
8Elfogadva1ms508 KiB
9Elfogadva1ms316 KiB
10Elfogadva1ms508 KiB
11Elfogadva1ms316 KiB
12Elfogadva1ms316 KiB
13Elfogadva1ms316 KiB
14Elfogadva1ms500 KiB
15Elfogadva1ms316 KiB
16Elfogadva1ms316 KiB
17Elfogadva1ms316 KiB
18Elfogadva1ms316 KiB
subtask40/34
19Futási hiba4ms3048 KiB
20Futási hiba4ms3076 KiB
21Futási hiba4ms3012 KiB
22Futási hiba4ms3024 KiB
23Futási hiba4ms3060 KiB
24Futási hiba4ms3032 KiB
25Futási hiba4ms2868 KiB
26Futási hiba4ms2868 KiB
27Futási hiba4ms2868 KiB
28Időlimit túllépés2.078s4148 KiB
29Időlimit túllépés2.099s4320 KiB
30Időlimit túllépés2.099s3892 KiB
31Időlimit túllépés2.085s4304 KiB
32Futási hiba4ms2868 KiB
33Futási hiba4ms2868 KiB
subtask50/21
34Hibás válasz273ms1076 KiB
35Elfogadva529ms1588 KiB
36Elfogadva531ms1588 KiB
37Elfogadva529ms1736 KiB
38Elfogadva527ms1772 KiB
39Elfogadva527ms1736 KiB
40Hibás válasz518ms1588 KiB
41Hibás válasz518ms1588 KiB
42Hibás válasz145ms1076 KiB
43Hibás válasz148ms1072 KiB
44Hibás válasz149ms1076 KiB
45Hibás válasz149ms1076 KiB
46Hibás válasz149ms1072 KiB
47Hibás válasz137ms820 KiB
48Hibás válasz264ms1076 KiB
49Hibás válasz263ms1260 KiB
subtask60/22
50Futási hiba4ms2868 KiB
51Futási hiba4ms2868 KiB
52Futási hiba4ms3060 KiB
53Futási hiba4ms2868 KiB
54Futási hiba4ms3100 KiB
55Futási hiba4ms3196 KiB
56Futási hiba4ms2992 KiB
57Futási hiba4ms2868 KiB
58Hibás válasz639ms1728 KiB
59Időlimit túllépés2.088s4340 KiB
60Időlimit túllépés2.099s4316 KiB
61Időlimit túllépés2.099s4316 KiB
62Időlimit túllépés2.085s4444 KiB
63Időlimit túllépés2.082s4288 KiB
64Futási hiba4ms2868 KiB
65Futási hiba4ms2868 KiB
66Futási hiba4ms2868 KiB