104802024-04-03 11:25:25Valaki2Autópálya inflációcpp17Időlimit túllépés 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();
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva35ms80520 KiB
2Időlimit túllépés2.102s47800 KiB
subtask20/8
3Időlimit túllépés2.063s42180 KiB
4Időlimit túllépés2.055s42392 KiB
5Időlimit túllépés2.065s42596 KiB
6Időlimit túllépés2.065s45084 KiB
7Időlimit túllépés2.079s41652 KiB
subtask315/15
8Elfogadva45ms81580 KiB
9Elfogadva43ms81608 KiB
10Elfogadva45ms81680 KiB
11Elfogadva46ms81992 KiB
12Elfogadva46ms82264 KiB
13Elfogadva46ms82328 KiB
14Elfogadva54ms82268 KiB
15Elfogadva37ms82396 KiB
16Elfogadva46ms82292 KiB
17Elfogadva37ms82220 KiB
18Elfogadva35ms82356 KiB
subtask40/34
19Időlimit túllépés2.058s46384 KiB
20Időlimit túllépés2.081s44876 KiB
21Időlimit túllépés2.063s44044 KiB
22Időlimit túllépés2.072s46548 KiB
23Időlimit túllépés2.068s46684 KiB
24Időlimit túllépés2.063s43476 KiB
25Időlimit túllépés2.055s46548 KiB
26Időlimit túllépés2.055s46532 KiB
27Időlimit túllépés2.072s43200 KiB
28Időlimit túllépés2.075s43476 KiB
29Időlimit túllépés2.075s43188 KiB
30Időlimit túllépés2.061s43256 KiB
31Időlimit túllépés2.063s43412 KiB
32Időlimit túllépés2.061s43608 KiB
33Időlimit túllépés2.068s43424 KiB
subtask50/21
34Időlimit túllépés2.081s43712 KiB
35Időlimit túllépés2.065s45284 KiB
36Időlimit túllépés2.081s46964 KiB
37Időlimit túllépés2.058s46984 KiB
38Időlimit túllépés2.076s46940 KiB
39Időlimit túllépés2.065s46916 KiB
40Időlimit túllépés2.052s46944 KiB
41Időlimit túllépés2.046s46792 KiB
42Elfogadva1.243s83824 KiB
43Elfogadva1.123s83712 KiB
44Elfogadva1.123s83832 KiB
45Elfogadva1.121s83580 KiB
46Elfogadva1.207s83740 KiB
47Elfogadva1.167s83824 KiB
48Elfogadva1.692s84108 KiB
49Elfogadva1.672s84176 KiB
subtask60/22
50Időlimit túllépés2.068s44072 KiB
51Időlimit túllépés2.075s47168 KiB
52Időlimit túllépés2.068s50592 KiB
53Időlimit túllépés2.063s50472 KiB
54Időlimit túllépés2.072s56984 KiB
55Időlimit túllépés2.056s57048 KiB
56Időlimit túllépés2.048s44552 KiB
57Időlimit túllépés2.059s44808 KiB
58Időlimit túllépés2.072s43584 KiB
59Időlimit túllépés2.084s43888 KiB
60Időlimit túllépés2.059s43888 KiB
61Időlimit túllépés2.069s43808 KiB
62Időlimit túllépés2.048s43688 KiB
63Időlimit túllépés2.049s44180 KiB
64Időlimit túllépés2.069s44040 KiB
65Időlimit túllépés2.069s44256 KiB
66Időlimit túllépés2.072s44240 KiB