104822024-04-03 11:28:52Valaki2Autópálya inflációcpp17Időlimit túllépés 23/1002.099s19700 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 = 2; // 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
1Elfogadva8ms9324 KiB
2Időlimit túllépés2.099s7492 KiB
subtask28/8
3Elfogadva1.059s11184 KiB
4Elfogadva822ms10864 KiB
5Elfogadva810ms10820 KiB
6Elfogadva1.042s13928 KiB
7Elfogadva291ms10660 KiB
subtask315/15
8Elfogadva7ms10320 KiB
9Elfogadva8ms10316 KiB
10Elfogadva8ms10324 KiB
11Elfogadva8ms10592 KiB
12Elfogadva9ms10808 KiB
13Elfogadva8ms10972 KiB
14Elfogadva8ms10944 KiB
15Elfogadva8ms10912 KiB
16Elfogadva8ms11052 KiB
17Elfogadva7ms11176 KiB
18Elfogadva7ms11396 KiB
subtask40/34
19Időlimit túllépés2.062s15392 KiB
20Elfogadva1.776s13944 KiB
21Elfogadva1.809s13948 KiB
22Időlimit túllépés2s15548 KiB
23Időlimit túllépés2.01s15652 KiB
24Elfogadva1.5s12800 KiB
25Időlimit túllépés2.059s10976 KiB
26Időlimit túllépés2.058s11032 KiB
27Elfogadva1.264s12076 KiB
28Elfogadva657ms12292 KiB
29Elfogadva615ms12176 KiB
30Elfogadva437ms12240 KiB
31Elfogadva644ms12248 KiB
32Elfogadva830ms12376 KiB
33Elfogadva833ms12380 KiB
subtask50/21
34Elfogadva218ms11876 KiB
35Hibás válasz460ms12724 KiB
36Hibás válasz493ms14288 KiB
37Hibás válasz497ms14028 KiB
38Hibás válasz481ms14160 KiB
39Hibás válasz479ms14148 KiB
40Hibás válasz513ms12444 KiB
41Hibás válasz513ms12316 KiB
42Elfogadva108ms12232 KiB
43Elfogadva93ms12224 KiB
44Elfogadva93ms12224 KiB
45Elfogadva94ms12220 KiB
46Elfogadva104ms12336 KiB
47Hibás válasz101ms12336 KiB
48Elfogadva146ms12520 KiB
49Elfogadva149ms12512 KiB
subtask60/22
50Hibás válasz1.493s13520 KiB
51Időlimit túllépés2.013s16364 KiB
52Időlimit túllépés2.053s11700 KiB
53Időlimit túllépés2.065s11676 KiB
54Időlimit túllépés2.049s19700 KiB
55Időlimit túllépés2.046s11820 KiB
56Hibás válasz1.391s12876 KiB
57Hibás válasz1.394s13068 KiB
58Elfogadva175ms12716 KiB
59Elfogadva671ms13024 KiB
60Elfogadva643ms13024 KiB
61Elfogadva610ms13024 KiB
62Hibás válasz555ms12900 KiB
63Hibás válasz688ms13048 KiB
64Elfogadva837ms13152 KiB
65Elfogadva834ms13168 KiB
66Elfogadva694ms13100 KiB