#include "Annalib.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long llong;
typedef pair<llong, llong> pll;
static void dijkstra(vector<pll> edge[], llong dist[], int prev[], int s) {
priority_queue<pll> pq;
pq.emplace(dist[s] = 0, s);
while (!pq.empty()) {
auto [d, x] = pq.top(); pq.pop();
d = -d;
if (dist[x] != d) continue;
for (auto [i, c] : edge[x]) {
if (d + c < dist[i]) pq.emplace(-(dist[i] = d + c), i), prev[i] = x;
}
}
}
const static llong inf = 4e18;
static vector<pll> edge[300];
static llong distK[6][300], distQ[60][300];
static int par[300], a;
static llong get_dist(int i, int x, int k) {
if (k) return distQ[i][a] + distK[k][x];
return distQ[i][x];
}
void Anna(int n, int m, int A[], int B[], llong C[], int q, int S[], int T[], int k, int U[]) {
a = A[U[0]];
for (int i = 0; i < m; ++i) {
bool in = 0;
for (int j = 0; j < k; ++j) if (i == U[j]) in = 1;
if (!in) edge[A[i]].emplace_back(B[i], C[i]);
}
memset(distQ, 0x3f, sizeof(distQ));
for (int i = 0; i < q; ++i) {
dijkstra(edge, distQ[i], par, S[i]);
}
memset(distK, 0x3f, sizeof(distK));
for (int i = 1; i <= k; ++i) {
dijkstra(edge, distK[i], par, B[U[i - 1]]);
for (int j = 0; j < n; ++j) distK[i][j] += C[U[i - 1]];
}
vector<int> G[6];
for (int i = 0; i < q; ++i) G[0].push_back(i);
unsigned long long ret = 0;
vector<unsigned> mul, add;
for (int w = 1; w <= k; ++w) {
for (int i = 0; i < w; ++i) {
vector<int> O, N;
for (int g : G[i]) {
if (distQ[g][a] >= inf || distK[w][T[g]] >= inf) O.push_back(g);
else if (!i && distQ[g][T[g]] >= inf || i && (distQ[g][a] >= inf || distK[i][T[g]] >= inf)) N.push_back(g);
else (get_dist(g, T[g], i) <= get_dist(g, T[g], w) ? O : N).push_back(g);
}
mul.push_back(G[i].size() + 1u);
add.push_back(O.size());
G[i] = O;
for (int j : N) G[w].push_back(j);
}
}
for (int i = mul.size(); i--; ) ret = ret * mul[i] + add[i];
while (ret) Tap(ret & 1u), ret >>= 1;
}
#include "Brunolib.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long llong;
typedef pair<llong, llong> pll;
static void dijkstra(vector<pll> edge[], llong dist[], int prev[], int s) {
priority_queue<pll> pq;
pq.emplace(dist[s] = 0, s);
while (!pq.empty()) {
auto [d, x] = pq.top(); pq.pop();
d = -d;
if (dist[x] != d) continue;
for (auto [i, c] : edge[x]) {
if (d + c < dist[i]) pq.emplace(-(dist[i] = d + c), i), prev[i] = x;
}
}
}
const static llong inf = 4e18;
static vector<pll> edge[300];
static llong distK[6][300], distQ[60][300];
static int parK[6][300], parQ[60][300], a;
static llong get_dist(int i, int x, int k) {
if (k) return distQ[i][a] + distK[k][x];
return distQ[i][x];
}
void Bruno(int n, int m, int A[], int B[], llong C[], int q, int S[], int T[], int k, int U[], int l, int V[]) {
unsigned long long ret = 0;
while (l--) ret = ret << 1 | unsigned(V[l]);
a = A[U[0]];
map<pll, int> idx;
for (int i = 0; i < m; ++i) {
idx[pll(A[i], B[i])] = i;
if (C[i] != -1) edge[A[i]].emplace_back(B[i], C[i]);
}
memset(distQ, 0x3f, sizeof(distQ));
for (int i = 0; i < q; ++i) {
dijkstra(edge, distQ[i], parQ[i], S[i]);
}
memset(distK, 0x3f, sizeof(distK));
for (int i = 1; i <= k; ++i) {
dijkstra(edge, distK[i], parK[i], B[U[i - 1]]);
}
vector<int> G[6];
for (int i = 0; i < q; ++i) G[0].push_back(i);
for (int w = 1; w <= k; ++w) {
for (int i = 0; i < w; ++i) {
int cnt = ret % (G[i].size() + 1u);
ret /= G[i].size() + 1u;
vector<int> nG, O, N;
for (int g : G[i]) {
if (distQ[g][a] >= inf || distK[w][T[g]] >= inf) O.push_back(g), --cnt;
else if (!i && distQ[g][T[g]] >= inf || i && (distQ[g][a] >= inf || distK[i][T[g]] >= inf)) N.push_back(g);
else nG.push_back(g);
}
sort(nG.begin(), nG.end(), [&](int a, int b) {
return get_dist(a, T[a], i) - get_dist(a, T[a], w) < get_dist(b, T[b], i) - get_dist(b, T[b], w);
});
for (int j = 0; j < int(nG.size()); ++j) (j < cnt ? O : N).push_back(nG[j]);
G[i] = O;
for (int j : N) G[w].push_back(j);
}
}
int res[60];
for (int i = 0; i <= k; ++i) for (int j : G[i]) res[j] = i;
for (int i = 0; i < q; ++i) {
int x = T[i];
vector<int> path;
if (res[i]) {
for (; x != B[U[res[i] - 1]]; x = parK[res[i]][x]) path.push_back(idx[pll(parK[res[i]][x], x)]);
path.push_back(U[res[i] - 1]);
x = a;
}
for (; x != S[i]; x = parQ[i][x]) path.push_back(idx[pll(parQ[i][x], x)]);
for (int j = path.size(); j--; ) Answer(path[j]);
Answer(-1);
}
}
Compilation message
Anna.cpp: In function 'void Anna(int, int, int*, int*, llong*, int, int*, int*, int, int*)':
Anna.cpp:56:29: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
else if (!i && distQ[g][T[g]] >= inf || i && (distQ[g][a] >= inf || distK[i][T[g]] >= inf)) N.push_back(g);
~~~^~~~~~~~~~~~~~~~~~~~~~~~
Bruno.cpp: In function 'void Bruno(int, int, int*, int*, llong*, int, int*, int*, int, int*, int, int*)':
Bruno.cpp:57:29: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
else if (!i && distQ[g][T[g]] >= inf || i && (distQ[g][a] >= inf || distK[i][T[g]] >= inf)) N.push_back(g);
~~~^~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
4912 KB |
Output is correct - L = 24 |
2 |
Correct |
6 ms |
4908 KB |
Output is correct - L = 23 |
3 |
Correct |
6 ms |
5168 KB |
Output is correct - L = 20 |
4 |
Correct |
6 ms |
4764 KB |
Output is correct - L = 27 |
5 |
Correct |
7 ms |
4892 KB |
Output is correct - L = 24 |
6 |
Correct |
6 ms |
4864 KB |
Output is correct - L = 27 |
7 |
Correct |
6 ms |
4716 KB |
Output is correct - L = 30 |
8 |
Correct |
7 ms |
5048 KB |
Output is correct - L = 18 |
9 |
Correct |
10 ms |
5240 KB |
Output is correct - L = 18 |
10 |
Correct |
13 ms |
5700 KB |
Output is correct - L = 18 |
11 |
Correct |
7 ms |
4824 KB |
Output is correct - L = 4 |
12 |
Correct |
176 ms |
26280 KB |
Output is correct - L = 18 |
13 |
Correct |
7 ms |
4908 KB |
Output is correct - L = 26 |
14 |
Correct |
7 ms |
4824 KB |
Output is correct - L = 1 |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
9 ms |
5012 KB |
Output is correct - L = 63 |
2 |
Correct |
8 ms |
5232 KB |
Output is correct - L = 63 |
3 |
Correct |
8 ms |
5028 KB |
Output is correct - L = 45 |
4 |
Correct |
10 ms |
5168 KB |
Output is correct - L = 44 |
5 |
Correct |
8 ms |
4908 KB |
Output is correct - L = 61 |
6 |
Correct |
10 ms |
5188 KB |
Output is correct - L = 60 |
7 |
Correct |
10 ms |
5292 KB |
Output is correct - L = 34 |
8 |
Correct |
10 ms |
5292 KB |
Output is correct - L = 34 |
9 |
Correct |
8 ms |
5436 KB |
Output is correct - L = 64 |
10 |
Correct |
8 ms |
5436 KB |
Output is correct - L = 64 |
11 |
Correct |
8 ms |
5308 KB |
Output is correct - L = 64 |
12 |
Correct |
10 ms |
5420 KB |
Output is correct - L = 30 |
13 |
Correct |
205 ms |
25328 KB |
Output is correct - L = 30 |
14 |
Correct |
9 ms |
5176 KB |
Output is correct - L = 60 |
15 |
Correct |
9 ms |
5164 KB |
Output is correct - L = 38 |
16 |
Correct |
16 ms |
5512 KB |
Output is correct - L = 34 |
17 |
Correct |
20 ms |
5928 KB |
Output is correct - L = 37 |
18 |
Correct |
28 ms |
6988 KB |
Output is correct - L = 42 |
19 |
Correct |
6 ms |
4924 KB |
Output is correct - L = 37 |
20 |
Correct |
26 ms |
7552 KB |
Output is correct - L = 30 |
21 |
Correct |
36 ms |
7792 KB |
Output is correct - L = 30 |
22 |
Correct |
8 ms |
5524 KB |
Output is correct - L = 63 |
23 |
Correct |
8 ms |
5688 KB |
Output is correct - L = 64 |
24 |
Correct |
8 ms |
5436 KB |
Output is correct - L = 64 |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
5140 KB |
Output is correct - L = 63 |
2 |
Correct |
8 ms |
5228 KB |
Output is correct - L = 63 |
3 |
Correct |
8 ms |
5184 KB |
Output is correct - L = 45 |
4 |
Correct |
8 ms |
5168 KB |
Output is correct - L = 44 |
5 |
Correct |
8 ms |
4908 KB |
Output is correct - L = 61 |
6 |
Correct |
10 ms |
5176 KB |
Output is correct - L = 60 |
7 |
Correct |
10 ms |
5416 KB |
Output is correct - L = 34 |
8 |
Correct |
10 ms |
5400 KB |
Output is correct - L = 34 |
9 |
Correct |
7 ms |
5308 KB |
Output is correct - L = 64 |
10 |
Correct |
7 ms |
5524 KB |
Output is correct - L = 64 |
11 |
Correct |
8 ms |
5308 KB |
Output is correct - L = 64 |
12 |
Correct |
12 ms |
5416 KB |
Output is correct - L = 30 |
13 |
Correct |
216 ms |
25132 KB |
Output is correct - L = 30 |
14 |
Correct |
10 ms |
5172 KB |
Output is correct - L = 60 |
15 |
Correct |
13 ms |
5164 KB |
Output is correct - L = 38 |
16 |
Correct |
20 ms |
5512 KB |
Output is correct - L = 34 |
17 |
Correct |
20 ms |
6344 KB |
Output is correct - L = 37 |
18 |
Correct |
30 ms |
7116 KB |
Output is correct - L = 42 |
19 |
Correct |
7 ms |
5052 KB |
Output is correct - L = 37 |
20 |
Correct |
26 ms |
7552 KB |
Output is correct - L = 30 |
21 |
Correct |
37 ms |
7656 KB |
Output is correct - L = 30 |
22 |
Correct |
8 ms |
5536 KB |
Output is correct - L = 63 |
23 |
Correct |
8 ms |
5664 KB |
Output is correct - L = 64 |
24 |
Correct |
7 ms |
5308 KB |
Output is correct - L = 64 |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
7 ms |
5140 KB |
Output is correct - L = 63 |
2 |
Correct |
8 ms |
5184 KB |
Output is correct - L = 63 |
3 |
Correct |
8 ms |
5044 KB |
Output is correct - L = 45 |
4 |
Correct |
8 ms |
5560 KB |
Output is correct - L = 44 |
5 |
Correct |
8 ms |
5164 KB |
Output is correct - L = 61 |
6 |
Correct |
10 ms |
5180 KB |
Output is correct - L = 60 |
7 |
Correct |
10 ms |
5416 KB |
Output is correct - L = 34 |
8 |
Correct |
10 ms |
5396 KB |
Output is correct - L = 34 |
9 |
Correct |
8 ms |
5392 KB |
Output is correct - L = 64 |
10 |
Correct |
8 ms |
5664 KB |
Output is correct - L = 64 |
11 |
Correct |
8 ms |
5512 KB |
Output is correct - L = 64 |
12 |
Correct |
10 ms |
5308 KB |
Output is correct - L = 30 |
13 |
Correct |
207 ms |
27360 KB |
Output is correct - L = 30 |
14 |
Correct |
10 ms |
5436 KB |
Output is correct - L = 60 |
15 |
Correct |
10 ms |
5424 KB |
Output is correct - L = 38 |
16 |
Correct |
14 ms |
5516 KB |
Output is correct - L = 34 |
17 |
Correct |
20 ms |
6108 KB |
Output is correct - L = 37 |
18 |
Correct |
28 ms |
6948 KB |
Output is correct - L = 42 |
19 |
Correct |
7 ms |
4924 KB |
Output is correct - L = 37 |
20 |
Correct |
26 ms |
7568 KB |
Output is correct - L = 30 |
21 |
Correct |
37 ms |
7672 KB |
Output is correct - L = 30 |
22 |
Correct |
8 ms |
5528 KB |
Output is correct - L = 63 |
23 |
Correct |
8 ms |
5452 KB |
Output is correct - L = 64 |
24 |
Correct |
7 ms |
5524 KB |
Output is correct - L = 64 |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
10 ms |
5012 KB |
Output is correct - L = 63 |
2 |
Correct |
8 ms |
5140 KB |
Output is correct - L = 63 |
3 |
Correct |
7 ms |
5192 KB |
Output is correct - L = 45 |
4 |
Correct |
9 ms |
5164 KB |
Output is correct - L = 44 |
5 |
Correct |
8 ms |
4888 KB |
Output is correct - L = 61 |
6 |
Correct |
12 ms |
5144 KB |
Output is correct - L = 60 |
7 |
Correct |
8 ms |
5016 KB |
Output is correct - L = 34 |
8 |
Correct |
10 ms |
5396 KB |
Output is correct - L = 34 |
9 |
Correct |
8 ms |
5528 KB |
Output is correct - L = 64 |
10 |
Correct |
8 ms |
5540 KB |
Output is correct - L = 64 |
11 |
Correct |
8 ms |
5408 KB |
Output is correct - L = 64 |
12 |
Correct |
10 ms |
5144 KB |
Output is correct - L = 30 |
13 |
Correct |
212 ms |
23124 KB |
Output is correct - L = 30 |
14 |
Correct |
11 ms |
5300 KB |
Output is correct - L = 60 |
15 |
Correct |
9 ms |
5144 KB |
Output is correct - L = 38 |
16 |
Correct |
19 ms |
5516 KB |
Output is correct - L = 34 |
17 |
Correct |
24 ms |
5956 KB |
Output is correct - L = 37 |
18 |
Correct |
35 ms |
6476 KB |
Output is correct - L = 42 |
19 |
Correct |
7 ms |
4932 KB |
Output is correct - L = 37 |
20 |
Correct |
26 ms |
7044 KB |
Output is correct - L = 30 |
21 |
Correct |
37 ms |
7588 KB |
Output is correct - L = 30 |
22 |
Correct |
8 ms |
5532 KB |
Output is correct - L = 63 |
23 |
Correct |
8 ms |
5532 KB |
Output is correct - L = 64 |
24 |
Correct |
8 ms |
5520 KB |
Output is correct - L = 64 |