#include "Annalib.h"
#include<bits/stdc++.h>
using namespace std;
const long long INF = LLONG_MAX/2;
const int maxn = 305;
namespace anna{
vector<pair<int, int>> g[maxn];
vector<long long> shortest_path(int N, int s, long long C[]){
vector<long long> d(N, INF);
vector<int> vis(N, 0);
d[s] = 0;
for(int i = 1; i <= N; i++){
long long best = INF;
int x = -1;
for(int j = 0; j < N; j++){
if(vis[j])continue;
if(d[j] < best){
best = d[j];
x = j;
}
}
if(x == -1)break;
vis[x] = 1;
for(auto v: g[x]) if(d[v.first] > C[v.second] + best)d[v.first] = C[v.second] + best;
}
return d;
}
void solve(int K, int Q, vector<long long>& forgor_C, vector<vector<long long>>& cost_to_T){
// eval(i, x) = forgor(x) + cost_to_T
vector<vector<int>> queries(K+1);
for(int i = 0; i < Q; i++)queries[0].push_back(i);
for(int b = 1; b <= K; b++){
long long total_case = 1, crr = 0;
for(int a = 0; a < b; a++){
vector<int> a_wins;
for(auto v: queries[a]){
if(forgor_C[a] + cost_to_T[a][v] < forgor_C[b] + cost_to_T[b][v])a_wins.push_back(v);
else queries[b].push_back(v);
}
int cases = queries[a].size() + 1, num = a_wins.size();
total_case *= cases;
crr*=cases;
crr += num;
queries[a] = a_wins;
}
while(total_case > 1){
Tap(crr&1);
total_case = (total_case+1)>>1;
crr>>=1;
}
}
}
}
void Anna(int N, int M, int A[], int B[], long long C[], int Q, int S[], int T[], int K, int U[]) {
vector<long long> forgor_C(K+1, 0);
vector<vector<long long>> cost_to_T(K+1, vector<long long>(Q));
for(int i = 0; i < K; i++){
forgor_C[i] = C[U[i]];
}
for(int i = 0; i < K; i++)C[U[i]] = INF;
for(int i = 0; i < M; i++){
anna::g[A[i]].push_back({B[i], i});
}
for(int i = 0; i < K; i++){
auto d = anna::shortest_path(N, B[U[i]], C);
for(int j = 0; j < Q; j++)cost_to_T[i][j] = d[T[j]];
}
for(int i = 0; i < Q; i++){
auto d = anna::shortest_path(N, S[i], C);
for(int j = 0; j < K; j++)cost_to_T[j][i] += d[A[U[j]]];
cost_to_T[K][i] = d[T[i]];
}
anna::solve(K, Q, forgor_C, cost_to_T);
// eval(i, x) = forgor(x) + cost_to_A + cost_to_T
}
#include "Brunolib.h"
#include<bits/stdc++.h>
using namespace std;
const int maxn = 305;
const long long INF = 1e16*maxn;
namespace bruno {
vector<pair<int, int>> g[maxn];
vector<long long> shortest_path(int N, int s, long long C[]){
vector<long long> d(N, INF);
vector<int> vis(N, 0);
d[s] = 0;
for(int i = 1; i <= N; i++){
long long best = INF;
int x = -1;
for(int j = 0; j < N; j++){
if(vis[j])continue;
if(d[j] < best){
best = d[j];
x = j;
}
}
if(x == -1)break;
vis[x] = 1;
for(auto v: g[x]) if(d[v.first] > C[v.second] + best)d[v.first] = C[v.second] + best;
}
return d;
}
vector<int> path[60];
vector<int> solve_query(int N, int s, int t, long long C[]){
vector<long long> d(N, INF);
vector<int> vis(N, 0);
vector<pair<int, int>> trace(N);
d[s] = 0;
for(int i = 1; i <= N; i++){
long long best = INF;
int x = -1;
for(int j = 0; j < N; j++){
if(vis[j])continue;
if(d[j] < best){
best = d[j];
x = j;
}
}
if(x == -1)break;
vis[x] = 1;
for(auto v: g[x]) if(d[v.first] > C[v.second] + best){
d[v.first] = C[v.second] + best;
trace[v.first] = {x, v.second};
}
}
vector<int> ans;
while(t != s){
ans.push_back(trace[t].second);
t = trace[t].first;
}
reverse(ans.begin(), ans.end());
return ans;
}
vector<vector<int>> solve(int K, int Q, vector<vector<long long>>& cost_to_T, int &ptr, int X[]){
vector<vector<int>> queries(K+1);
for(int i = 0; i < Q; i++)queries[0].push_back(i);
for(int b = 1; b <= K; b++){
long long total_case = 1, crr = 0;
for(int a = 0; a < b; a++)total_case*=(queries[a].size()+1);
for(int i = 0; total_case > 1; i++){
crr ^= X[ptr++]<<i;
total_case = (total_case+1)>>1;
}
for(int a = b-1; a >= 0; a--){
auto cmp = [&a, &b, &cost_to_T](int lhs, int rhs){
return cost_to_T[a][lhs] - cost_to_T[b][lhs] < cost_to_T[a][rhs] - cost_to_T[b][rhs];
};
int cases = queries[a].size() + 1;
sort(queries[a].begin(), queries[a].end(), cmp);
while(queries[a].size() > crr%cases){
queries[b].push_back(queries[a].back());
queries[a].pop_back();
}
crr/=cases;
}
}
return queries;
}
}
void Bruno(int N, int M, int A[], int B[], long long C[], int Q, int S[], int T[], int K, int U[], int L, int X[]) {
vector<vector<long long>> cost_to_T(K+1, vector<long long>(Q));
for(int i = 0; i < K; i++)C[U[i]] = INF;
for(int i = 0; i < M; i++){
bruno::g[A[i]].push_back({B[i], i});
}
for(int i = 0; i < K; i++){
auto d = bruno::shortest_path(N, B[U[i]], C);
for(int j = 0; j < Q; j++)cost_to_T[i][j] = d[T[j]];
}
for(int i = 0; i < Q; i++){
auto d = bruno::shortest_path(N, S[i], C);
for(int j = 0; j < K; j++)cost_to_T[j][i] += d[A[U[j]]];
cost_to_T[K][i] = d[T[i]];
};
int ptr = 0;
auto qtypes = bruno::solve(K, Q, cost_to_T, ptr, X);
for(int i = 0; i <= K; i++){
if(i < K)C[U[i]] = 0;
for(auto v: qtypes[i]){
bruno::path[v] = bruno::solve_query(N, S[v], T[v], C);
if(i == K)for(auto ele: bruno::path[v]){
for(int j = 0; j < K; j++)assert(ele != U[j]);
}
}
if(i < K)C[U[i]] = INF;
}
for(int i = 0; i < Q; i++){
for(auto v: bruno::path[i])Answer(v);
Answer(-1);
}
}
Compilation message
Bruno.cpp: In function 'std::vector<std::vector<int> > bruno::solve(int, int, std::vector<std::vector<long long int> >&, int&, int*)':
Bruno.cpp:83:29: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
83 | while(queries[a].size() > crr%cases){
| ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
9 ms |
4396 KB |
Output is correct - L = 28 |
2 |
Correct |
9 ms |
4400 KB |
Output is correct - L = 23 |
3 |
Correct |
7 ms |
4400 KB |
Output is correct - L = 26 |
4 |
Correct |
7 ms |
4392 KB |
Output is correct - L = 27 |
5 |
Correct |
9 ms |
4640 KB |
Output is correct - L = 27 |
6 |
Correct |
8 ms |
4392 KB |
Output is correct - L = 27 |
7 |
Correct |
9 ms |
4380 KB |
Output is correct - L = 30 |
8 |
Correct |
9 ms |
4408 KB |
Output is correct - L = 20 |
9 |
Correct |
9 ms |
4624 KB |
Output is correct - L = 20 |
10 |
Correct |
11 ms |
4732 KB |
Output is correct - L = 20 |
11 |
Correct |
4 ms |
4388 KB |
Output is correct - L = 5 |
12 |
Correct |
76 ms |
14216 KB |
Output is correct - L = 20 |
13 |
Correct |
6 ms |
4392 KB |
Output is correct - L = 31 |
14 |
Correct |
3 ms |
4396 KB |
Output is correct - L = 1 |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
23 ms |
4900 KB |
Output is correct - L = 64 |
2 |
Correct |
27 ms |
4612 KB |
Output is correct - L = 64 |
3 |
Correct |
25 ms |
4908 KB |
Output is correct - L = 53 |
4 |
Correct |
28 ms |
4900 KB |
Output is correct - L = 56 |
5 |
Correct |
23 ms |
4392 KB |
Output is correct - L = 63 |
6 |
Correct |
28 ms |
5152 KB |
Output is correct - L = 63 |
7 |
Correct |
25 ms |
4912 KB |
Output is correct - L = 45 |
8 |
Correct |
27 ms |
4944 KB |
Output is correct - L = 63 |
9 |
Correct |
10 ms |
4904 KB |
Output is correct - L = 65 |
10 |
Correct |
12 ms |
4912 KB |
Output is correct - L = 65 |
11 |
Correct |
10 ms |
4924 KB |
Output is correct - L = 65 |
12 |
Correct |
28 ms |
4908 KB |
Output is correct - L = 62 |
13 |
Correct |
122 ms |
14592 KB |
Output is correct - L = 33 |
14 |
Correct |
28 ms |
4924 KB |
Output is correct - L = 63 |
15 |
Correct |
27 ms |
4904 KB |
Output is correct - L = 53 |
16 |
Correct |
33 ms |
4908 KB |
Output is correct - L = 34 |
17 |
Correct |
34 ms |
4984 KB |
Output is correct - L = 42 |
18 |
Correct |
37 ms |
5328 KB |
Output is correct - L = 46 |
19 |
Correct |
13 ms |
4400 KB |
Output is correct - L = 42 |
20 |
Correct |
30 ms |
5900 KB |
Output is correct - L = 57 |
21 |
Correct |
40 ms |
6088 KB |
Output is correct - L = 30 |
22 |
Correct |
10 ms |
4912 KB |
Output is correct - L = 65 |
23 |
Correct |
11 ms |
4912 KB |
Output is correct - L = 65 |
24 |
Correct |
10 ms |
4920 KB |
Output is correct - L = 65 |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
24 ms |
5152 KB |
Output is correct - L = 64 |
2 |
Correct |
28 ms |
4396 KB |
Output is correct - L = 64 |
3 |
Correct |
25 ms |
4900 KB |
Output is correct - L = 53 |
4 |
Correct |
27 ms |
4908 KB |
Output is correct - L = 56 |
5 |
Correct |
25 ms |
4396 KB |
Output is correct - L = 63 |
6 |
Correct |
27 ms |
4904 KB |
Output is correct - L = 63 |
7 |
Correct |
25 ms |
4904 KB |
Output is correct - L = 45 |
8 |
Correct |
33 ms |
4944 KB |
Output is correct - L = 63 |
9 |
Correct |
10 ms |
4920 KB |
Output is correct - L = 65 |
10 |
Correct |
10 ms |
4984 KB |
Output is correct - L = 65 |
11 |
Correct |
10 ms |
4920 KB |
Output is correct - L = 65 |
12 |
Correct |
27 ms |
4912 KB |
Output is correct - L = 62 |
13 |
Correct |
122 ms |
14380 KB |
Output is correct - L = 33 |
14 |
Correct |
31 ms |
4904 KB |
Output is correct - L = 63 |
15 |
Correct |
27 ms |
4904 KB |
Output is correct - L = 53 |
16 |
Correct |
33 ms |
4936 KB |
Output is correct - L = 34 |
17 |
Correct |
34 ms |
4984 KB |
Output is correct - L = 42 |
18 |
Correct |
38 ms |
5188 KB |
Output is correct - L = 46 |
19 |
Correct |
12 ms |
4400 KB |
Output is correct - L = 42 |
20 |
Correct |
30 ms |
5912 KB |
Output is correct - L = 57 |
21 |
Correct |
44 ms |
5908 KB |
Output is correct - L = 30 |
22 |
Correct |
10 ms |
4912 KB |
Output is correct - L = 65 |
23 |
Correct |
10 ms |
4920 KB |
Output is correct - L = 65 |
24 |
Correct |
12 ms |
4980 KB |
Output is correct - L = 65 |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
21 ms |
4924 KB |
Output is correct - L = 64 |
2 |
Correct |
27 ms |
4596 KB |
Output is correct - L = 64 |
3 |
Correct |
26 ms |
4912 KB |
Output is correct - L = 53 |
4 |
Correct |
27 ms |
4908 KB |
Output is correct - L = 56 |
5 |
Correct |
25 ms |
4656 KB |
Output is correct - L = 63 |
6 |
Correct |
28 ms |
4908 KB |
Output is correct - L = 63 |
7 |
Correct |
25 ms |
4912 KB |
Output is correct - L = 45 |
8 |
Correct |
28 ms |
4896 KB |
Output is correct - L = 63 |
9 |
Correct |
10 ms |
4920 KB |
Output is correct - L = 65 |
10 |
Correct |
12 ms |
4920 KB |
Output is correct - L = 65 |
11 |
Correct |
10 ms |
4980 KB |
Output is correct - L = 65 |
12 |
Correct |
28 ms |
4944 KB |
Output is correct - L = 62 |
13 |
Correct |
124 ms |
14436 KB |
Output is correct - L = 33 |
14 |
Correct |
28 ms |
4900 KB |
Output is correct - L = 63 |
15 |
Correct |
27 ms |
4908 KB |
Output is correct - L = 53 |
16 |
Correct |
33 ms |
4992 KB |
Output is correct - L = 34 |
17 |
Correct |
34 ms |
4984 KB |
Output is correct - L = 42 |
18 |
Correct |
38 ms |
5316 KB |
Output is correct - L = 46 |
19 |
Correct |
12 ms |
4392 KB |
Output is correct - L = 42 |
20 |
Correct |
29 ms |
5900 KB |
Output is correct - L = 57 |
21 |
Correct |
41 ms |
5908 KB |
Output is correct - L = 30 |
22 |
Correct |
12 ms |
4972 KB |
Output is correct - L = 65 |
23 |
Correct |
10 ms |
4908 KB |
Output is correct - L = 65 |
24 |
Correct |
11 ms |
4912 KB |
Output is correct - L = 65 |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
22 ms |
4900 KB |
Output is correct - L = 64 |
2 |
Correct |
27 ms |
4616 KB |
Output is correct - L = 64 |
3 |
Correct |
25 ms |
4904 KB |
Output is correct - L = 53 |
4 |
Correct |
30 ms |
5056 KB |
Output is correct - L = 56 |
5 |
Correct |
23 ms |
4388 KB |
Output is correct - L = 63 |
6 |
Correct |
27 ms |
4904 KB |
Output is correct - L = 63 |
7 |
Correct |
25 ms |
4904 KB |
Output is correct - L = 45 |
8 |
Correct |
27 ms |
4912 KB |
Output is correct - L = 63 |
9 |
Correct |
10 ms |
5164 KB |
Output is partially correct - L = 65 |
10 |
Correct |
10 ms |
4908 KB |
Output is partially correct - L = 65 |
11 |
Correct |
10 ms |
4912 KB |
Output is partially correct - L = 65 |
12 |
Correct |
28 ms |
4952 KB |
Output is correct - L = 62 |
13 |
Correct |
118 ms |
14376 KB |
Output is correct - L = 33 |
14 |
Correct |
27 ms |
4904 KB |
Output is correct - L = 63 |
15 |
Correct |
27 ms |
4928 KB |
Output is correct - L = 53 |
16 |
Correct |
33 ms |
4996 KB |
Output is correct - L = 34 |
17 |
Correct |
34 ms |
4984 KB |
Output is correct - L = 42 |
18 |
Correct |
38 ms |
5336 KB |
Output is correct - L = 46 |
19 |
Correct |
16 ms |
4528 KB |
Output is correct - L = 42 |
20 |
Correct |
42 ms |
5892 KB |
Output is correct - L = 57 |
21 |
Correct |
41 ms |
5904 KB |
Output is correct - L = 30 |
22 |
Correct |
10 ms |
4920 KB |
Output is partially correct - L = 65 |
23 |
Correct |
10 ms |
4912 KB |
Output is partially correct - L = 65 |
24 |
Correct |
10 ms |
4912 KB |
Output is partially correct - L = 65 |