10482 | 2024-04-03 11:28:52 | Valaki2 | Autópálya infláció | cpp17 | Időlimit túllépés 23/100 | 2.099s | 19700 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 | Összpont | Teszt | Verdikt | Idő | Memória | ||
---|---|---|---|---|---|---|---|
subtask1 | 0/0 | ||||||
1 | Elfogadva | 8ms | 9324 KiB | ||||
2 | Időlimit túllépés | 2.099s | 7492 KiB | ||||
subtask2 | 8/8 | ||||||
3 | Elfogadva | 1.059s | 11184 KiB | ||||
4 | Elfogadva | 822ms | 10864 KiB | ||||
5 | Elfogadva | 810ms | 10820 KiB | ||||
6 | Elfogadva | 1.042s | 13928 KiB | ||||
7 | Elfogadva | 291ms | 10660 KiB | ||||
subtask3 | 15/15 | ||||||
8 | Elfogadva | 7ms | 10320 KiB | ||||
9 | Elfogadva | 8ms | 10316 KiB | ||||
10 | Elfogadva | 8ms | 10324 KiB | ||||
11 | Elfogadva | 8ms | 10592 KiB | ||||
12 | Elfogadva | 9ms | 10808 KiB | ||||
13 | Elfogadva | 8ms | 10972 KiB | ||||
14 | Elfogadva | 8ms | 10944 KiB | ||||
15 | Elfogadva | 8ms | 10912 KiB | ||||
16 | Elfogadva | 8ms | 11052 KiB | ||||
17 | Elfogadva | 7ms | 11176 KiB | ||||
18 | Elfogadva | 7ms | 11396 KiB | ||||
subtask4 | 0/34 | ||||||
19 | Időlimit túllépés | 2.062s | 15392 KiB | ||||
20 | Elfogadva | 1.776s | 13944 KiB | ||||
21 | Elfogadva | 1.809s | 13948 KiB | ||||
22 | Időlimit túllépés | 2s | 15548 KiB | ||||
23 | Időlimit túllépés | 2.01s | 15652 KiB | ||||
24 | Elfogadva | 1.5s | 12800 KiB | ||||
25 | Időlimit túllépés | 2.059s | 10976 KiB | ||||
26 | Időlimit túllépés | 2.058s | 11032 KiB | ||||
27 | Elfogadva | 1.264s | 12076 KiB | ||||
28 | Elfogadva | 657ms | 12292 KiB | ||||
29 | Elfogadva | 615ms | 12176 KiB | ||||
30 | Elfogadva | 437ms | 12240 KiB | ||||
31 | Elfogadva | 644ms | 12248 KiB | ||||
32 | Elfogadva | 830ms | 12376 KiB | ||||
33 | Elfogadva | 833ms | 12380 KiB | ||||
subtask5 | 0/21 | ||||||
34 | Elfogadva | 218ms | 11876 KiB | ||||
35 | Hibás válasz | 460ms | 12724 KiB | ||||
36 | Hibás válasz | 493ms | 14288 KiB | ||||
37 | Hibás válasz | 497ms | 14028 KiB | ||||
38 | Hibás válasz | 481ms | 14160 KiB | ||||
39 | Hibás válasz | 479ms | 14148 KiB | ||||
40 | Hibás válasz | 513ms | 12444 KiB | ||||
41 | Hibás válasz | 513ms | 12316 KiB | ||||
42 | Elfogadva | 108ms | 12232 KiB | ||||
43 | Elfogadva | 93ms | 12224 KiB | ||||
44 | Elfogadva | 93ms | 12224 KiB | ||||
45 | Elfogadva | 94ms | 12220 KiB | ||||
46 | Elfogadva | 104ms | 12336 KiB | ||||
47 | Hibás válasz | 101ms | 12336 KiB | ||||
48 | Elfogadva | 146ms | 12520 KiB | ||||
49 | Elfogadva | 149ms | 12512 KiB | ||||
subtask6 | 0/22 | ||||||
50 | Hibás válasz | 1.493s | 13520 KiB | ||||
51 | Időlimit túllépés | 2.013s | 16364 KiB | ||||
52 | Időlimit túllépés | 2.053s | 11700 KiB | ||||
53 | Időlimit túllépés | 2.065s | 11676 KiB | ||||
54 | Időlimit túllépés | 2.049s | 19700 KiB | ||||
55 | Időlimit túllépés | 2.046s | 11820 KiB | ||||
56 | Hibás válasz | 1.391s | 12876 KiB | ||||
57 | Hibás válasz | 1.394s | 13068 KiB | ||||
58 | Elfogadva | 175ms | 12716 KiB | ||||
59 | Elfogadva | 671ms | 13024 KiB | ||||
60 | Elfogadva | 643ms | 13024 KiB | ||||
61 | Elfogadva | 610ms | 13024 KiB | ||||
62 | Hibás válasz | 555ms | 12900 KiB | ||||
63 | Hibás válasz | 688ms | 13048 KiB | ||||
64 | Elfogadva | 837ms | 13152 KiB | ||||
65 | Elfogadva | 834ms | 13168 KiB | ||||
66 | Elfogadva | 694ms | 13100 KiB |