160802025-03-30 20:05:26szilAutópálya inflációcpp17Hibás válasz 15/100252ms6220 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 (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
2Hibás válasz189ms6016 KiB
subtask20/8
3Elfogadva127ms4612 KiB
4Hibás válasz105ms4788 KiB
5Hibás válasz76ms4612 KiB
6Elfogadva123ms4596 KiB
7Hibás válasz48ms4612 KiB
subtask315/15
8Elfogadva1ms316 KiB
9Elfogadva1ms316 KiB
10Elfogadva1ms316 KiB
11Elfogadva1ms316 KiB
12Elfogadva1ms316 KiB
13Elfogadva1ms508 KiB
14Elfogadva1ms508 KiB
15Elfogadva1ms316 KiB
16Elfogadva1ms316 KiB
17Elfogadva1ms316 KiB
18Elfogadva1ms316 KiB
subtask40/34
19Elfogadva232ms5940 KiB
20Hibás válasz156ms6028 KiB
21Hibás válasz128ms6056 KiB
22Elfogadva217ms6020 KiB
23Elfogadva216ms6028 KiB
24Hibás válasz68ms6020 KiB
25Elfogadva250ms5944 KiB
26Elfogadva230ms6020 KiB
27Hibás válasz208ms6032 KiB
28Hibás válasz61ms4608 KiB
29Hibás válasz59ms4612 KiB
30Hibás válasz37ms4172 KiB
31Hibás válasz63ms4596 KiB
32Hibás válasz64ms6004 KiB
33Hibás válasz64ms6008 KiB
subtask50/21
34Hibás válasz13ms1548 KiB
35Elfogadva59ms1840 KiB
36Elfogadva61ms1588 KiB
37Elfogadva63ms1620 KiB
38Elfogadva63ms1844 KiB
39Elfogadva64ms1844 KiB
40Hibás válasz63ms1844 KiB
41Hibás válasz63ms1836 KiB
42Hibás válasz13ms1116 KiB
43Hibás válasz8ms1076 KiB
44Hibás válasz8ms1076 KiB
45Hibás válasz8ms1076 KiB
46Hibás válasz10ms1076 KiB
47Hibás válasz9ms1076 KiB
48Hibás válasz18ms1356 KiB
49Hibás válasz18ms1348 KiB
subtask60/22
50Hibás válasz68ms5988 KiB
51Hibás válasz200ms6212 KiB
52Elfogadva225ms6024 KiB
53Elfogadva228ms6160 KiB
54Elfogadva252ms6220 KiB
55Elfogadva233ms6016 KiB
56Hibás válasz203ms6032 KiB
57Hibás válasz203ms5940 KiB
58Hibás válasz14ms1844 KiB
59Hibás válasz61ms4556 KiB
60Hibás válasz57ms4616 KiB
61Hibás válasz54ms4608 KiB
62Hibás válasz41ms4380 KiB
63Hibás válasz61ms4588 KiB
64Hibás válasz67ms6016 KiB
65Hibás válasz71ms6008 KiB
66Hibás válasz61ms6024 KiB