Submission #715994

#TimeUsernameProblemLanguageResultExecution timeMemory
715994sandry24Toll (BOI17_toll)C++17
0 / 100
220 ms337900 KiB
#include <bits/stdc++.h> using namespace std; //#pragma GCC optimize("O3,unroll-loops") //#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") typedef long long ll; typedef vector<int> vi; typedef pair<int, int> pi; #define pb push_back #define mp make_pair #define f first #define s second ll k, n, m, o; ll ans[5][5], temp[5][5], dp[50000][17][5][5]; void combine(ll t[5][5], ll a[5][5], ll b[5][5]){ for(int i = 0; i < k; i++){ for(int j = 0; j < k; j++){ for(int l = 0; l < k; l++){ t[i][j] = min(t[i][j], a[i][l] + b[l][j]); } } } } void solve(){ cin >> k >> n >> m >> o; ll INF = 1e18; for(int i = 0; i <= n/k+1; i++){ for(int y = 0; y < 17; y++){ for(int j = 0; j < k; j++){ for(int l = 0; l < k; l++){ dp[i][y][j][l] = INF; } } } } for(int i = 0; i < m; i++){ int a, b, w; cin >> a >> b >> w; dp[a/k][0][a % k][b % k] = w; } //dp[i][y][j][l] cel mai scurt drum de la k*i + j de la k*(i + 2^y - 1) + l; //dp[i][y][j][l] = dp[i][y-1][j][temp] + dp[i + 2^(y-1)[y-1][temp][l]; for(int y = 1; y < 17; y++){ for(int i = 0; i + (1 << y) <= n/k+1; i++){ combine(dp[i][y], dp[i][y-1], dp[i + (1 << (y-1))][y-1]); } } for(int u = 0; u < o; u++){ int a, b; cin >> a >> b; for(int j = 0; j < 5; j++){ for(int l = 0; l < 5; l++) ans[j][l] = INF; } for (int i = 0; i < 5; i++) ans[i][i] = 0; ll ord1 = a/k, ord2 = b/k, mod1 = a % k, mod2 = b % k; for (int i = 16; i >= 0; i--) { if (ord1 + (1 << i) <= ord2) { for(int j = 0; j < 5; j++){ for(int l = 0; l < 5; l++) temp[j][l] = INF; } combine(temp, ans, dp[ord1][i]); for(int j = 0; j < 5; j++){ for(int l = 0; l < 5; l++) ans[j][l] = temp[j][l]; } ord1 += (1 << i); } } if(ans[mod1][mod2] == INF) cout << -1 << '\n'; else cout << ans[mod1][mod2] << '\n'; } } int main(){ //freopen("infasuratoare.in", "r", stdin); //freopen("infasuratoare.out", "w", stdout); ios::sync_with_stdio(0); cin.tie(0); int t = 1; //cin >> t; while(t--){ solve(); } }
#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...