104882024-04-03 11:55:43Valaki2Autópálya inflációcpp17Időlimit túllépés 15/1002.085s83272 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 = 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<int, 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(0, mp(dist[1][0], mp(1, 0))));
    while(!q.empty()) {
        pii curpair = q.top().se.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(-(cur_steps + 1), 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ÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva35ms80316 KiB
2Időlimit túllépés2.079s44560 KiB
subtask20/8
3Időlimit túllépés2.079s42036 KiB
4Időlimit túllépés2.084s42236 KiB
5Időlimit túllépés2.043s41792 KiB
6Időlimit túllépés2.084s43352 KiB
7Időlimit túllépés2.059s41412 KiB
subtask315/15
8Elfogadva37ms81156 KiB
9Elfogadva43ms81152 KiB
10Elfogadva46ms81172 KiB
11Elfogadva45ms81172 KiB
12Elfogadva43ms81448 KiB
13Elfogadva45ms81344 KiB
14Elfogadva46ms81492 KiB
15Elfogadva37ms81764 KiB
16Elfogadva37ms81556 KiB
17Elfogadva35ms81604 KiB
18Elfogadva35ms81808 KiB
subtask40/34
19Időlimit túllépés2.059s45728 KiB
20Időlimit túllépés2.072s44316 KiB
21Időlimit túllépés2.072s43592 KiB
22Időlimit túllépés2.063s45952 KiB
23Időlimit túllépés2.055s45976 KiB
24Időlimit túllépés2.075s42760 KiB
25Időlimit túllépés2.055s45940 KiB
26Időlimit túllépés2.079s45960 KiB
27Időlimit túllépés2.055s42524 KiB
28Időlimit túllépés2.059s42616 KiB
29Időlimit túllépés2.079s42492 KiB
30Időlimit túllépés2.059s42256 KiB
31Időlimit túllépés2.052s42448 KiB
32Időlimit túllépés2.072s42440 KiB
33Időlimit túllépés2.068s42508 KiB
subtask50/21
34Időlimit túllépés2.068s42420 KiB
35Időlimit túllépés2.059s43372 KiB
36Időlimit túllépés2.075s43344 KiB
37Időlimit túllépés2.052s43320 KiB
38Időlimit túllépés2.072s43684 KiB
39Időlimit túllépés2.056s43920 KiB
40Időlimit túllépés2.072s43544 KiB
41Időlimit túllépés2.049s43484 KiB
42Elfogadva1.243s83244 KiB
43Elfogadva1.065s83192 KiB
44Elfogadva1.07s83272 KiB
45Elfogadva1.07s83008 KiB
46Elfogadva1.179s83020 KiB
47Elfogadva1.118s83036 KiB
48Elfogadva1.669s83192 KiB
49Elfogadva1.636s83192 KiB
subtask60/22
50Időlimit túllépés2.055s43508 KiB
51Időlimit túllépés2.072s45028 KiB
52Időlimit túllépés2.063s46704 KiB
53Időlimit túllépés2.069s46868 KiB
54Időlimit túllépés2.029s46868 KiB
55Időlimit túllépés2.061s46732 KiB
56Időlimit túllépés2.085s43300 KiB
57Időlimit túllépés2.079s43444 KiB
58Időlimit túllépés2.026s83204 KiB
59Időlimit túllépés2.069s43380 KiB
60Időlimit túllépés2.049s43508 KiB
61Időlimit túllépés2.076s43336 KiB
62Időlimit túllépés2.048s43344 KiB
63Időlimit túllépés2.075s43816 KiB
64Időlimit túllépés2.048s43692 KiB
65Időlimit túllépés2.048s43720 KiB
66Időlimit túllépés2.048s43492 KiB