Submission #148108

#TimeUsernameProblemLanguageResultExecution timeMemory
148108WhipppedCreamToll (BOI17_toll)C++17
100 / 100
450 ms19472 KiB
#include <bits/stdc++.h> #define ii pair<int, int> #define X first #define Y second #define pb push_back #define mp make_pair #define vi vector<int> #define vii vector< pair<int, int> > typedef long long ll; using namespace std; int K; vector< vector< vector<int> > > mat; vector< vector<int> > iden; vii adj[50005]; struct node { vector< vector<int> > dat; node *left, *right; node(){} node(vector< vector<int> > want, node *A, node *B) { dat.assign(K, vi(K, 0)); dat = want; left = A, right = B; } }; node* build(int L, int R) { if(L == R) return new node(mat[L], NULL, NULL); node* res = new node(vector< vector<int> >(K, vi(K, 0)), NULL, NULL); res->left = build(L, (L+R)/2); res->right = build((L+R)/2+1, R); for(int i = 0; i< K; i++) { for(int j = 0; j< K; j++) { int best = 1e9; for(int k = 0; k< K; k++) { best = min(best, res->left->dat[i][k]+res->right->dat[k][j]); } res->dat[i][j] = best; } } return res; } node query(node* p, int L, int R, int i, int j) { //printf("it's %d %d %d %d\n", L, R, i, j); if(i> R || j< L) return node(iden, NULL, NULL); if(i<= L && R<= j) return *p; node res(vector< vi >(K, vi(K, 0)), NULL, NULL); node x = query(p->left, L, (L+R)/2, i, j); node y = query(p->right, (L+R)/2+1, R, i, j); //printf("here for %d %d\n", L, R); for(int i = 0; i< K; i++) { for(int j = 0; j< K; j++) { int best = 1e9; for(int k = 0; k< K; k++) { best = min(best, x.dat[i][k]+y.dat[k][j]); } res.dat[i][j] = best; } } return res; } int main() { int n, m, q; scanf("%d %d %d %d", &K, &n, &m, &q); mat.assign(n/K+1, vector< vector<int> >(K, vi(K, 1e9))); for(int i = 0; i< m; i++) { int a, b, w; scanf("%d %d %d", &a, &b, &w); adj[a].pb(ii(b, w)); mat[a/K][a%K][b%K] = min(mat[a/K][a%K][b%K], w); } iden.assign(K, vi(K, 1e9)); for(int i = 0; i< K; i++) iden[i][i] = 0; node *root = build(0, (n-1)/K-1); //printf("ok\n"); while(q--) { int x, y; scanf("%d %d", &x, &y); //kprintf("hihi\n"); if(x == y) { printf("0\n"); continue; } if(x> y) swap(x, y); int x1 = x/K, x2 = x%K; int y1 = y/K, y2 = y%K; if(x1 == y1) { printf("-1\n"); continue; } node tmp = query(root, 0, (n-1)/K-1, x1, y1-1); //printf("%d %d\n", x2, y2); int res = tmp.dat[x2][y2]; if(res == 1e9) printf("-1\n"); else printf("%d\n", res); /* vector< vector<int> > ans(K, vi(K, 0)); for(int p = x1; p< y1; p++) { vector< vector<int> > rub(K, vi(K, 1e9)); for(int i = 0; i< K; i++) { for(int j = 0; j< K; j++) { for(int k = 0; k< K; k++) { rub[i][j] = min(rub[i][j], ans[i][k]+mat[p][k][j]); } } } for(int i = 0; i< K; i++) { for(int j = 0; j< K; j++) { printf("%d ", rub[i][j]); } printf("\n"); } for(int i = 0; i< K; i++) for(int j = 0; j< K; j++) ans[i][j] = rub[i][j]; } int res = ans[x2][y2]; if(res == 1e9) printf("-1\n"); else printf("%d\n", res); */ } return 0; }

Compilation message (stderr)

toll.cpp: In function 'int main()':
toll.cpp:73:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d %d", &K, &n, &m, &q);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
toll.cpp:77:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         int a, b, w; scanf("%d %d %d", &a, &b, &w);
                      ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
toll.cpp:87:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         int x, y; scanf("%d %d", &x, &y);
                   ~~~~~^~~~~~~~~~~~~~~~~
#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...