104882024-04-03 11:55:43Valaki2Autópálya inflációcpp17Time limit exceeded 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();
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted35ms80316 KiB
2Time limit exceeded2.079s44560 KiB
subtask20/8
3Time limit exceeded2.079s42036 KiB
4Time limit exceeded2.084s42236 KiB
5Time limit exceeded2.043s41792 KiB
6Time limit exceeded2.084s43352 KiB
7Time limit exceeded2.059s41412 KiB
subtask315/15
8Accepted37ms81156 KiB
9Accepted43ms81152 KiB
10Accepted46ms81172 KiB
11Accepted45ms81172 KiB
12Accepted43ms81448 KiB
13Accepted45ms81344 KiB
14Accepted46ms81492 KiB
15Accepted37ms81764 KiB
16Accepted37ms81556 KiB
17Accepted35ms81604 KiB
18Accepted35ms81808 KiB
subtask40/34
19Time limit exceeded2.059s45728 KiB
20Time limit exceeded2.072s44316 KiB
21Time limit exceeded2.072s43592 KiB
22Time limit exceeded2.063s45952 KiB
23Time limit exceeded2.055s45976 KiB
24Time limit exceeded2.075s42760 KiB
25Time limit exceeded2.055s45940 KiB
26Time limit exceeded2.079s45960 KiB
27Time limit exceeded2.055s42524 KiB
28Time limit exceeded2.059s42616 KiB
29Time limit exceeded2.079s42492 KiB
30Time limit exceeded2.059s42256 KiB
31Time limit exceeded2.052s42448 KiB
32Time limit exceeded2.072s42440 KiB
33Time limit exceeded2.068s42508 KiB
subtask50/21
34Time limit exceeded2.068s42420 KiB
35Time limit exceeded2.059s43372 KiB
36Time limit exceeded2.075s43344 KiB
37Time limit exceeded2.052s43320 KiB
38Time limit exceeded2.072s43684 KiB
39Time limit exceeded2.056s43920 KiB
40Time limit exceeded2.072s43544 KiB
41Time limit exceeded2.049s43484 KiB
42Accepted1.243s83244 KiB
43Accepted1.065s83192 KiB
44Accepted1.07s83272 KiB
45Accepted1.07s83008 KiB
46Accepted1.179s83020 KiB
47Accepted1.118s83036 KiB
48Accepted1.669s83192 KiB
49Accepted1.636s83192 KiB
subtask60/22
50Time limit exceeded2.055s43508 KiB
51Time limit exceeded2.072s45028 KiB
52Time limit exceeded2.063s46704 KiB
53Time limit exceeded2.069s46868 KiB
54Time limit exceeded2.029s46868 KiB
55Time limit exceeded2.061s46732 KiB
56Time limit exceeded2.085s43300 KiB
57Time limit exceeded2.079s43444 KiB
58Time limit exceeded2.026s83204 KiB
59Time limit exceeded2.069s43380 KiB
60Time limit exceeded2.049s43508 KiB
61Time limit exceeded2.076s43336 KiB
62Time limit exceeded2.048s43344 KiB
63Time limit exceeded2.075s43816 KiB
64Time limit exceeded2.048s43692 KiB
65Time limit exceeded2.048s43720 KiB
66Time limit exceeded2.048s43492 KiB