160812025-03-30 20:05:53szilAutópálya inflációcpp17Hibás válasz 15/1001.468s6224 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();
    }
    vector<bigint> dist_last(n+1);
    dist_last[1].clear();
    vis[1] = 1;
    int is_ok = -1;
    for (int i = 1; i <= n; i++) {

        if (is_ok != -1 && is_ok + 40 < i) break;

        bool ok = true;
        for (int j = 1; j <= n; j++) {
            if (!vis[j]) ok = false;
        }
        if (ok && is_ok == -1) is_ok = 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
2Elfogadva237ms6032 KiB
subtask20/8
3Elfogadva133ms4616 KiB
4Hibás válasz153ms4628 KiB
5Hibás válasz166ms4608 KiB
6Elfogadva125ms4608 KiB
7Hibás válasz1.335s4612 KiB
subtask315/15
8Elfogadva1ms316 KiB
9Elfogadva1ms316 KiB
10Elfogadva1ms316 KiB
11Elfogadva1ms316 KiB
12Elfogadva1ms316 KiB
13Elfogadva1ms316 KiB
14Elfogadva1ms316 KiB
15Elfogadva1ms316 KiB
16Elfogadva1ms328 KiB
17Elfogadva1ms316 KiB
18Elfogadva1ms316 KiB
subtask40/34
19Elfogadva250ms6028 KiB
20Hibás válasz275ms6036 KiB
21Hibás válasz291ms6036 KiB
22Elfogadva234ms6036 KiB
23Elfogadva252ms6032 KiB
24Hibás válasz361ms6040 KiB
25Elfogadva231ms6036 KiB
26Elfogadva238ms6020 KiB
27Hibás válasz185ms6040 KiB
28Hibás válasz384ms4608 KiB
29Hibás válasz505ms4624 KiB
30Hibás válasz1.166s4180 KiB
31Hibás válasz433ms4596 KiB
32Hibás válasz737ms6012 KiB
33Hibás válasz689ms6012 KiB
subtask50/21
34Hibás válasz43ms1568 KiB
35Elfogadva57ms1836 KiB
36Elfogadva57ms1844 KiB
37Elfogadva57ms1836 KiB
38Elfogadva56ms1840 KiB
39Elfogadva56ms1840 KiB
40Hibás válasz54ms1588 KiB
41Hibás válasz54ms1844 KiB
42Hibás válasz26ms1136 KiB
43Hibás válasz43ms1076 KiB
44Hibás válasz45ms1136 KiB
45Hibás válasz45ms1136 KiB
46Hibás válasz29ms1136 KiB
47Hibás válasz28ms1108 KiB
48Hibás válasz39ms1352 KiB
49Hibás válasz39ms1332 KiB
subtask60/22
50Hibás válasz398ms6224 KiB
51Elfogadva250ms6028 KiB
52Elfogadva236ms6028 KiB
53Elfogadva277ms6172 KiB
54Elfogadva252ms6028 KiB
55Elfogadva256ms6056 KiB
56Hibás válasz185ms6132 KiB
57Hibás válasz174ms5816 KiB
58Hibás válasz156ms1824 KiB
59Hibás válasz474ms4616 KiB
60Hibás válasz546ms4616 KiB
61Hibás válasz653ms4616 KiB
62Hibás válasz767ms4404 KiB
63Hibás válasz405ms4576 KiB
64Hibás válasz704ms6004 KiB
65Hibás válasz839ms6008 KiB
66Hibás válasz1.468s5936 KiB