10481 2024. 04. 03 11:27:46 Valaki2 Autópálya infláció cpp17 Futási hiba 36/100 1.978s 9956 KiB
#include <bits/stdc++.h>
using namespace std;

#define distance distance1337

#define int long long
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define fi first
#define se second

const int maxn = 600;
const int mod = 1e9 + 7;
const int k = 32; // log2 max c_i + epsilon

struct distance {
    bitset<1 + maxn> bs;
    distance() {
        bs = 0;
    }
    distance(int num) {
        if(num == -1) {
            bs.set();
        } else {
            bs = num;
        }
    }
    distance(bitset<1 + maxn> bs_) {
        bs = bs_;
    }
    bool operator < (const distance &other) const {
        // reversed
        for(int i = maxn; i >= 0; i--) {
            if(other.bs[i] ^ bs[i]) {
                if(other.bs[i] > bs[i]) {
                    return false;
                } else {
                    return true;
                }
            }
        }
        return false;
    }
    // debug
    void print() {
        cout << bs.to_ullong();
    }
};

const distance inf = distance(-1);

int n, m;
vector<pii > graph[1 + maxn];
distance dist[1 + maxn][1 + k];
bool done[1 + maxn][1 + k];
int steps[1 + maxn];

void solve() {
    cin >> n >> m;
    for(int i = 1; i <= m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        graph[a].pb(mp(b, c));
        graph[b].pb(mp(a, c));
    }
    queue<int> bfsq;
    bfsq.push(1);
    while(!bfsq.empty()) {
        int cur = bfsq.front();
        bfsq.pop();
        for(pii nei : graph[cur]) {
            if(nei.fi != 1 && steps[nei.fi] == 0) {
                bfsq.push(nei.fi);
                steps[nei.fi] = steps[cur] + 1;
            }
        }
    }
    priority_queue<pair<distance, pii > > q;
    for(int i = 1; i <= n; i++) {
        for(int j = 0; j <= k; j++) {
            dist[i][j] = distance(-1);
        }
    }
    dist[1][0].bs = 0;
    q.push(mp(dist[1][0], mp(1, 0)));
    while(!q.empty()) {
        pii curpair = q.top().se;
        q.pop();
        int cur = curpair.fi, cur_steps = curpair.se;
        int cur_idx = cur_steps - steps[cur];
        // cout << cur << " " << cur_steps << " " << cur_idx << ":\n";
        if(done[cur][cur_idx]) {
            continue;
        }
        done[cur][cur_idx] = true;
        if(cur_steps >= n) {
            continue;
        }
        for(pii nei : graph[cur]) {
            int nei_idx = cur_steps + 1 - steps[nei.fi];
            if(nei_idx > k) {
                continue;
            }
            bitset<1 + maxn> tmp = (bitset<1 + maxn>(nei.se) << cur_steps);
            int carry = 0;
            for(int i = 0; i <= maxn; i++) {
                int sum = dist[cur][cur_idx].bs[i] + tmp[i] + carry;
                carry = sum / 2;
                tmp[i] = sum % 2;
            }
            distance neidist = distance(tmp);
            // distance neidist = distance(dist[cur][cur_idx].bs + (bitset<1 + maxn>(nei.se) << cur_steps));
            // reversed
            if(dist[nei.fi][nei_idx] < neidist) {
                dist[nei.fi][nei_idx] = neidist;
                q.push(mp(neidist, mp(nei.fi, cur_steps + 1)));
            }
        }
    }
    /*for(int i = 1; i <= n; i++) {
        for(int j = 0; j <= k; j++) {
            if(dist[i][j].bs[maxn] == 0) {
                dist[i][j].print();
            } else {
                cout << "-1";
            }
            cout << " ";
        }
        cout << "\n";
    }*/
    for(int i = 2; i <= n; i++) {
        distance ans_bs(-1);
        for(int j = 0; j <= k; j++) {
            ans_bs = max(ans_bs, dist[i][j]);
        }
        int ans = 0;
        int coeff = 1;
        for(int i = 0; i <= maxn; i++) {
            ans += coeff * ans_bs.bs[i];
            ans %= mod;
            coeff = (2 * coeff) % mod;
                    }
        cout << ans % mod << "\n";
    }
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 4ms 4976 KiB
2 Futási hiba 4ms 5256 KiB
subtask2 0/8
3 Futási hiba 4ms 5464 KiB
4 Futási hiba 4ms 5676 KiB
5 Futási hiba 4ms 5884 KiB
6 Futási hiba 4ms 5948 KiB
7 Futási hiba 4ms 6160 KiB
subtask3 15/15
8 Elfogadva 4ms 6556 KiB
9 Elfogadva 6ms 6380 KiB
10 Elfogadva 6ms 6388 KiB
11 Elfogadva 7ms 6392 KiB
12 Elfogadva 7ms 6444 KiB
13 Elfogadva 7ms 6672 KiB
14 Elfogadva 7ms 6880 KiB
15 Elfogadva 4ms 7080 KiB
16 Elfogadva 4ms 7160 KiB
17 Elfogadva 4ms 7464 KiB
18 Elfogadva 4ms 7420 KiB
subtask4 0/34
19 Futási hiba 4ms 7588 KiB
20 Futási hiba 4ms 7664 KiB
21 Futási hiba 4ms 7888 KiB
22 Futási hiba 4ms 7964 KiB
23 Futási hiba 4ms 7760 KiB
24 Futási hiba 4ms 7888 KiB
25 Futási hiba 4ms 8032 KiB
26 Futási hiba 4ms 8012 KiB
27 Futási hiba 4ms 8012 KiB
28 Futási hiba 4ms 8132 KiB
29 Futási hiba 4ms 8088 KiB
30 Futási hiba 4ms 8044 KiB
31 Futási hiba 4ms 7972 KiB
32 Futási hiba 4ms 8200 KiB
33 Futási hiba 4ms 8068 KiB
subtask5 21/21
34 Elfogadva 592ms 8336 KiB
35 Elfogadva 1.414s 9836 KiB
36 Elfogadva 1.437s 9852 KiB
37 Elfogadva 1.455s 9840 KiB
38 Elfogadva 1.501s 9844 KiB
39 Elfogadva 1.498s 9956 KiB
40 Elfogadva 1.934s 9932 KiB
41 Elfogadva 1.978s 9904 KiB
42 Elfogadva 232ms 8144 KiB
43 Elfogadva 192ms 8076 KiB
44 Elfogadva 192ms 8312 KiB
45 Elfogadva 192ms 8308 KiB
46 Elfogadva 222ms 8328 KiB
47 Elfogadva 217ms 8328 KiB
48 Elfogadva 317ms 8404 KiB
49 Elfogadva 314ms 8408 KiB
subtask6 0/22
50 Futási hiba 4ms 8184 KiB
51 Futási hiba 4ms 8184 KiB
52 Futási hiba 4ms 8256 KiB
53 Futási hiba 4ms 8352 KiB
54 Futási hiba 4ms 8340 KiB
55 Futási hiba 4ms 8264 KiB
56 Futási hiba 4ms 8292 KiB
57 Futási hiba 4ms 8212 KiB
58 Futási hiba 4ms 8176 KiB
59 Futási hiba 4ms 8180 KiB
60 Futási hiba 4ms 8180 KiB
61 Futási hiba 4ms 8320 KiB
62 Futási hiba 4ms 8320 KiB
63 Futási hiba 4ms 8404 KiB
64 Futási hiba 4ms 8368 KiB
65 Futási hiba 4ms 8356 KiB
66 Futási hiba 4ms 8172 KiB