104802024-04-03 11:25:25Valaki2Autópálya inflációcpp17Time limit exceeded 15/1002.102s84176 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<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();
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted35ms80520 KiB
2Time limit exceeded2.102s47800 KiB
subtask20/8
3Time limit exceeded2.063s42180 KiB
4Time limit exceeded2.055s42392 KiB
5Time limit exceeded2.065s42596 KiB
6Time limit exceeded2.065s45084 KiB
7Time limit exceeded2.079s41652 KiB
subtask315/15
8Accepted45ms81580 KiB
9Accepted43ms81608 KiB
10Accepted45ms81680 KiB
11Accepted46ms81992 KiB
12Accepted46ms82264 KiB
13Accepted46ms82328 KiB
14Accepted54ms82268 KiB
15Accepted37ms82396 KiB
16Accepted46ms82292 KiB
17Accepted37ms82220 KiB
18Accepted35ms82356 KiB
subtask40/34
19Time limit exceeded2.058s46384 KiB
20Time limit exceeded2.081s44876 KiB
21Time limit exceeded2.063s44044 KiB
22Time limit exceeded2.072s46548 KiB
23Time limit exceeded2.068s46684 KiB
24Time limit exceeded2.063s43476 KiB
25Time limit exceeded2.055s46548 KiB
26Time limit exceeded2.055s46532 KiB
27Time limit exceeded2.072s43200 KiB
28Time limit exceeded2.075s43476 KiB
29Time limit exceeded2.075s43188 KiB
30Time limit exceeded2.061s43256 KiB
31Time limit exceeded2.063s43412 KiB
32Time limit exceeded2.061s43608 KiB
33Time limit exceeded2.068s43424 KiB
subtask50/21
34Time limit exceeded2.081s43712 KiB
35Time limit exceeded2.065s45284 KiB
36Time limit exceeded2.081s46964 KiB
37Time limit exceeded2.058s46984 KiB
38Time limit exceeded2.076s46940 KiB
39Time limit exceeded2.065s46916 KiB
40Time limit exceeded2.052s46944 KiB
41Time limit exceeded2.046s46792 KiB
42Accepted1.243s83824 KiB
43Accepted1.123s83712 KiB
44Accepted1.123s83832 KiB
45Accepted1.121s83580 KiB
46Accepted1.207s83740 KiB
47Accepted1.167s83824 KiB
48Accepted1.692s84108 KiB
49Accepted1.672s84176 KiB
subtask60/22
50Time limit exceeded2.068s44072 KiB
51Time limit exceeded2.075s47168 KiB
52Time limit exceeded2.068s50592 KiB
53Time limit exceeded2.063s50472 KiB
54Time limit exceeded2.072s56984 KiB
55Time limit exceeded2.056s57048 KiB
56Time limit exceeded2.048s44552 KiB
57Time limit exceeded2.059s44808 KiB
58Time limit exceeded2.072s43584 KiB
59Time limit exceeded2.084s43888 KiB
60Time limit exceeded2.059s43888 KiB
61Time limit exceeded2.069s43808 KiB
62Time limit exceeded2.048s43688 KiB
63Time limit exceeded2.049s44180 KiB
64Time limit exceeded2.069s44040 KiB
65Time limit exceeded2.069s44256 KiB
66Time limit exceeded2.072s44240 KiB