10484 2024. 04. 03 11:33:15 Valaki2 Autópálya infláció cpp17 Időlimit túllépés 15/100 2.101s 84476 KiB
#include <bits/stdc++.h>
using namespace std;

#pragma GCC target ("avx2")
#pragma GCC optimize("O3","unroll-loops")

#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 = 3100;
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 35ms 80584 KiB
2 Időlimit túllépés 2.061s 47840 KiB
subtask2 0/8
3 Időlimit túllépés 2.075s 42148 KiB
4 Időlimit túllépés 2.036s 42328 KiB
5 Időlimit túllépés 2.068s 42248 KiB
6 Időlimit túllépés 2.072s 44980 KiB
7 Időlimit túllépés 2.063s 41588 KiB
subtask3 15/15
8 Elfogadva 37ms 81604 KiB
9 Elfogadva 41ms 81476 KiB
10 Elfogadva 43ms 81768 KiB
11 Elfogadva 43ms 81832 KiB
12 Elfogadva 52ms 81984 KiB
13 Elfogadva 52ms 82192 KiB
14 Elfogadva 46ms 82080 KiB
15 Elfogadva 43ms 82296 KiB
16 Elfogadva 39ms 82532 KiB
17 Elfogadva 41ms 82852 KiB
18 Elfogadva 43ms 82708 KiB
subtask4 0/34
19 Időlimit túllépés 2.073s 46664 KiB
20 Időlimit túllépés 2.068s 45044 KiB
21 Időlimit túllépés 2.056s 45348 KiB
22 Időlimit túllépés 2.061s 46840 KiB
23 Időlimit túllépés 2.059s 46832 KiB
24 Időlimit túllépés 2.058s 43720 KiB
25 Időlimit túllépés 2.076s 46792 KiB
26 Időlimit túllépés 2.049s 46708 KiB
27 Időlimit túllépés 2.079s 43348 KiB
28 Időlimit túllépés 2.016s 43732 KiB
29 Időlimit túllépés 2.085s 43736 KiB
30 Időlimit túllépés 2.076s 43452 KiB
31 Időlimit túllépés 2.075s 43636 KiB
32 Időlimit túllépés 2.101s 43780 KiB
33 Időlimit túllépés 2.052s 43760 KiB
subtask5 0/21
34 Időlimit túllépés 2.072s 43828 KiB
35 Időlimit túllépés 2.059s 45240 KiB
36 Időlimit túllépés 2.028s 46952 KiB
37 Időlimit túllépés 2.065s 46860 KiB
38 Időlimit túllépés 2.068s 46956 KiB
39 Időlimit túllépés 2.049s 46884 KiB
40 Időlimit túllépés 2.076s 46764 KiB
41 Időlimit túllépés 2.079s 46744 KiB
42 Elfogadva 1.105s 83808 KiB
43 Elfogadva 1.003s 83736 KiB
44 Elfogadva 994ms 83740 KiB
45 Elfogadva 991ms 83624 KiB
46 Elfogadva 1.07s 83800 KiB
47 Elfogadva 1.031s 83792 KiB
48 Elfogadva 1.478s 84216 KiB
49 Elfogadva 1.468s 84476 KiB
subtask6 0/22
50 Időlimit túllépés 2.069s 44608 KiB
51 Időlimit túllépés 2.075s 47660 KiB
52 Időlimit túllépés 2.073s 50624 KiB
53 Időlimit túllépés 2.033s 50796 KiB
54 Időlimit túllépés 2.065s 57124 KiB
55 Időlimit túllépés 2.073s 57380 KiB
56 Időlimit túllépés 2.081s 44756 KiB
57 Időlimit túllépés 2.039s 44828 KiB
58 Elfogadva 1.875s 84104 KiB
59 Időlimit túllépés 2.076s 44236 KiB
60 Időlimit túllépés 2.068s 44036 KiB
61 Időlimit túllépés 2.075s 44144 KiB
62 Időlimit túllépés 2.063s 43856 KiB
63 Időlimit túllépés 2.084s 44232 KiB
64 Időlimit túllépés 2.068s 44340 KiB
65 Időlimit túllépés 2.069s 44232 KiB
66 Időlimit túllépés 2.055s 43976 KiB