104812024-04-03 11:27:46Valaki2Autópálya inflációcpp17Futási hiba 36/1001.978s9956 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 = 600;
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
1Elfogadva4ms4976 KiB
2Futási hiba4ms5256 KiB
subtask20/8
3Futási hiba4ms5464 KiB
4Futási hiba4ms5676 KiB
5Futási hiba4ms5884 KiB
6Futási hiba4ms5948 KiB
7Futási hiba4ms6160 KiB
subtask315/15
8Elfogadva4ms6556 KiB
9Elfogadva6ms6380 KiB
10Elfogadva6ms6388 KiB
11Elfogadva7ms6392 KiB
12Elfogadva7ms6444 KiB
13Elfogadva7ms6672 KiB
14Elfogadva7ms6880 KiB
15Elfogadva4ms7080 KiB
16Elfogadva4ms7160 KiB
17Elfogadva4ms7464 KiB
18Elfogadva4ms7420 KiB
subtask40/34
19Futási hiba4ms7588 KiB
20Futási hiba4ms7664 KiB
21Futási hiba4ms7888 KiB
22Futási hiba4ms7964 KiB
23Futási hiba4ms7760 KiB
24Futási hiba4ms7888 KiB
25Futási hiba4ms8032 KiB
26Futási hiba4ms8012 KiB
27Futási hiba4ms8012 KiB
28Futási hiba4ms8132 KiB
29Futási hiba4ms8088 KiB
30Futási hiba4ms8044 KiB
31Futási hiba4ms7972 KiB
32Futási hiba4ms8200 KiB
33Futási hiba4ms8068 KiB
subtask521/21
34Elfogadva592ms8336 KiB
35Elfogadva1.414s9836 KiB
36Elfogadva1.437s9852 KiB
37Elfogadva1.455s9840 KiB
38Elfogadva1.501s9844 KiB
39Elfogadva1.498s9956 KiB
40Elfogadva1.934s9932 KiB
41Elfogadva1.978s9904 KiB
42Elfogadva232ms8144 KiB
43Elfogadva192ms8076 KiB
44Elfogadva192ms8312 KiB
45Elfogadva192ms8308 KiB
46Elfogadva222ms8328 KiB
47Elfogadva217ms8328 KiB
48Elfogadva317ms8404 KiB
49Elfogadva314ms8408 KiB
subtask60/22
50Futási hiba4ms8184 KiB
51Futási hiba4ms8184 KiB
52Futási hiba4ms8256 KiB
53Futási hiba4ms8352 KiB
54Futási hiba4ms8340 KiB
55Futási hiba4ms8264 KiB
56Futási hiba4ms8292 KiB
57Futási hiba4ms8212 KiB
58Futási hiba4ms8176 KiB
59Futási hiba4ms8180 KiB
60Futási hiba4ms8180 KiB
61Futási hiba4ms8320 KiB
62Futási hiba4ms8320 KiB
63Futási hiba4ms8404 KiB
64Futási hiba4ms8368 KiB
65Futási hiba4ms8356 KiB
66Futási hiba4ms8172 KiB