Submission #707187

#TimeUsernameProblemLanguageResultExecution timeMemory
707187thimote75Toll (BOI17_toll)C++14
100 / 100
231 ms169144 KiB
#include <bits/stdc++.h> using namespace std; #define num long long int nbNodes, nbRoads, bucketSize, nbQuery; int bucketCount; #define MAX_BUCKET_SIZE 5 #define MAX_BUCKET_GRID 25 #define LINF 1e17 struct AdjGraph { num grid[MAX_BUCKET_SIZE][MAX_BUCKET_SIZE]; AdjGraph () { for (int a = 0; a < bucketSize; a ++) for (int b = 0; b < bucketSize; b ++) grid[a][b] = LINF; } void identity () { for (int a = 0; a < bucketSize; a ++) for (int b = 0; b < bucketSize; b ++) grid[a][b] = a == b ? 0 : LINF; } AdjGraph compile (AdjGraph &other) { AdjGraph res; for (int a = 0; a < bucketSize; a ++) { for (int b = 0; b < bucketSize; b ++) { num minValue = LINF; for (int i = 0; i < bucketSize; i ++) { minValue = min( minValue, grid[a][i] + other.grid[i][b] ); } res.grid[a][b] = minValue; } } return res; } }; vector<vector<AdjGraph>> displacement_2k; int getBucket (int node) { return node / bucketSize; } int getBucketId(int node) { return node % bucketSize; } AdjGraph compile (int node, int delta) { AdjGraph left; left.identity(); int h = displacement_2k[0].size(); while (h >= 1) { h --; if (((1 << h) & delta) == 0) continue ; left = left.compile(displacement_2k[node][h]); node += 1 << h; } return left; } num solve (int a, int b) { int ba = getBucket(a), bb = getBucket(b); //bb --; AdjGraph graph = compile(ba, bb - ba); return graph.grid[getBucketId(a)][getBucketId(b)]; } int main () { cin >> bucketSize >> nbNodes >> nbRoads >> nbQuery; bucketCount = nbNodes / bucketSize; displacement_2k.resize(bucketCount, vector<AdjGraph>(ceil(log2(bucketCount)) + 1)); for (int idRoad = 0; idRoad < nbRoads; idRoad ++) { int a, b; cin >> a >> b; int ba = getBucket(a); int bb = getBucket(b); cin >> displacement_2k[ba][0].grid[getBucketId(a)][getBucketId(b)]; } for (int h = 0; h + 1 < displacement_2k[0].size(); h ++) { int delta = 1 << h; for (int id = 0; id + delta < bucketCount; id ++) { displacement_2k[id][h + 1] = displacement_2k[id][h].compile(displacement_2k[id + delta][h]); } } for (int q = 0; q < nbQuery; q ++) { int a, b; cin >> a >> b; num res = solve(a, b); if (res == LINF) cout << -1 << endl; else cout << res << endl; } }

Compilation message (stderr)

toll.cpp: In function 'int main()':
toll.cpp:97:13: warning: unused variable 'bb' [-Wunused-variable]
   97 |         int bb = getBucket(b);
      |             ^~
toll.cpp:102:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<AdjGraph>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |     for (int h = 0; h + 1 < displacement_2k[0].size(); h ++) {
      |                     ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...