104872024-04-03 11:53:21Valaki2Autópálya inflációcpp17Futási hiba 36/1001.363s8776 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<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
1Elfogadva4ms5064 KiB
2Futási hiba4ms5344 KiB
subtask20/8
3Futási hiba4ms5568 KiB
4Futási hiba4ms5772 KiB
5Futási hiba4ms6116 KiB
6Futási hiba4ms6216 KiB
7Futási hiba4ms6180 KiB
subtask315/15
8Elfogadva4ms6084 KiB
9Elfogadva6ms5968 KiB
10Elfogadva6ms5972 KiB
11Elfogadva6ms6232 KiB
12Elfogadva6ms6440 KiB
13Elfogadva6ms6396 KiB
14Elfogadva7ms6704 KiB
15Elfogadva4ms6600 KiB
16Elfogadva6ms6924 KiB
17Elfogadva4ms7228 KiB
18Elfogadva4ms7192 KiB
subtask40/34
19Futási hiba4ms7176 KiB
20Futási hiba4ms7204 KiB
21Futási hiba4ms7212 KiB
22Futási hiba4ms7356 KiB
23Futási hiba4ms7468 KiB
24Futási hiba4ms7448 KiB
25Futási hiba4ms7200 KiB
26Futási hiba4ms7200 KiB
27Futási hiba4ms7228 KiB
28Futási hiba4ms7204 KiB
29Futási hiba4ms7336 KiB
30Futási hiba4ms7412 KiB
31Futási hiba4ms7340 KiB
32Futási hiba4ms7548 KiB
33Futási hiba4ms7344 KiB
subtask521/21
34Elfogadva481ms7864 KiB
35Elfogadva1.151s8348 KiB
36Elfogadva1.177s8352 KiB
37Elfogadva1.189s8312 KiB
38Elfogadva1.19s8316 KiB
39Elfogadva1.185s8492 KiB
40Elfogadva1.287s8224 KiB
41Elfogadva1.363s8368 KiB
42Elfogadva189ms8012 KiB
43Elfogadva150ms8068 KiB
44Elfogadva151ms8184 KiB
45Elfogadva151ms8300 KiB
46Elfogadva175ms8312 KiB
47Elfogadva170ms8320 KiB
48Elfogadva261ms8476 KiB
49Elfogadva257ms8456 KiB
subtask60/22
50Futási hiba4ms8300 KiB
51Futási hiba4ms8300 KiB
52Futási hiba4ms8296 KiB
53Futási hiba4ms8304 KiB
54Futási hiba4ms8376 KiB
55Futási hiba4ms8520 KiB
56Futási hiba4ms8776 KiB
57Futási hiba4ms8640 KiB
58Futási hiba4ms8560 KiB
59Futási hiba4ms8552 KiB
60Futási hiba4ms8556 KiB
61Futási hiba4ms8548 KiB
62Futási hiba4ms8612 KiB
63Futási hiba4ms8620 KiB
64Futási hiba4ms8532 KiB
65Futási hiba4ms8620 KiB
66Futási hiba4ms8624 KiB