160822025-03-30 20:07:24szilAutópálya inflációcpp17Hibás válasz 15/1001.506s6212 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 + 60 < 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
2Elfogadva331ms6016 KiB
subtask20/8
3Elfogadva193ms4612 KiB
4Elfogadva202ms4808 KiB
5Hibás válasz231ms4604 KiB
6Elfogadva175ms4604 KiB
7Hibás válasz1.399s4612 KiB
subtask315/15
8Elfogadva1ms316 KiB
9Elfogadva1ms500 KiB
10Elfogadva1ms328 KiB
11Elfogadva1ms496 KiB
12Elfogadva1ms316 KiB
13Elfogadva1ms316 KiB
14Elfogadva1ms316 KiB
15Elfogadva1ms316 KiB
16Elfogadva1ms384 KiB
17Elfogadva1ms316 KiB
18Elfogadva1ms316 KiB
subtask40/34
19Elfogadva335ms5968 KiB
20Hibás válasz407ms6024 KiB
21Hibás válasz404ms6024 KiB
22Elfogadva337ms6032 KiB
23Elfogadva351ms6028 KiB
24Hibás válasz481ms6188 KiB
25Elfogadva358ms6036 KiB
26Elfogadva365ms6024 KiB
27Hibás válasz259ms6032 KiB
28Hibás válasz469ms4612 KiB
29Hibás válasz578ms4608 KiB
30Hibás válasz1.213s4336 KiB
31Hibás válasz501ms4848 KiB
32Hibás válasz851ms6164 KiB
33Hibás válasz813ms6008 KiB
subtask50/21
34Hibás válasz56ms1376 KiB
35Elfogadva82ms1844 KiB
36Elfogadva81ms1840 KiB
37Elfogadva82ms1844 KiB
38Elfogadva81ms1840 KiB
39Elfogadva81ms1844 KiB
40Hibás válasz79ms2036 KiB
41Hibás válasz79ms2040 KiB
42Elfogadva32ms1140 KiB
43Hibás válasz50ms1272 KiB
44Hibás válasz52ms1132 KiB
45Hibás válasz52ms1076 KiB
46Hibás válasz37ms1132 KiB
47Hibás válasz35ms1272 KiB
48Elfogadva52ms1352 KiB
49Elfogadva52ms1360 KiB
subtask60/22
50Hibás válasz479ms6028 KiB
51Elfogadva358ms6028 KiB
52Elfogadva363ms6024 KiB
53Elfogadva358ms5852 KiB
54Elfogadva345ms6024 KiB
55Elfogadva324ms6212 KiB
56Hibás válasz261ms5940 KiB
57Hibás válasz259ms5940 KiB
58Hibás válasz172ms1832 KiB
59Hibás válasz510ms4608 KiB
60Hibás válasz560ms4608 KiB
61Hibás válasz700ms4616 KiB
62Hibás válasz815ms4408 KiB
63Hibás válasz467ms4588 KiB
64Hibás válasz833ms6008 KiB
65Hibás válasz833ms6008 KiB
66Hibás válasz1.506s6024 KiB