Submission #1324253

#TimeUsernameProblemLanguageResultExecution timeMemory
1324253sh_qaxxorov_571Toll (BOI17_toll)C++20
46 / 100
3095 ms20084 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; const long long INF = 1e15; int K, N, M, O; // Qatlamlar orasidagi o'tish matritsasi struct Matrix { long long mat[5][5]; Matrix() { for(int i=0; i<5; ++i) for(int j=0; j<5; ++j) mat[i][j] = INF; } }; // Ikki matritsani birlashtirish (Floyd-Warshall kabi) Matrix multiply(const Matrix& A, const Matrix& B) { Matrix C; for(int i=0; i<K; ++i) for(int j=0; j<K; ++j) for(int k=0; k<K; ++k) C.mat[i][j] = min(C.mat[i][j], A.mat[i][k] + B.mat[k][j]); return C; } Matrix tree[50000]; // Segmentlar daraxti uchun (qatlamlar soni N/K) int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> K >> N >> M >> O; // Qirralarni o'qish va qatlamlararo matritsalarni to'ldirish vector<Matrix> adj((N/K) + 1); for(int i=0; i<M; ++i) { int u, v, t; cin >> u >> v >> t; adj[u/K].mat[u%K][v%K] = t; } // Segmentlar daraxtini qurish yoki oddiy DP bilan hisoblash // (So'rovlar a dan b gacha bo'lgani uchun qatlamlar bo'ylab o'tamiz) while(O--) { int a, b; cin >> a >> b; if (a/K > b/K) { cout << -1 << endl; continue; } // Dinamik dasturlash: dp[i] - a dan joriy qatlamdagi i-tugungacha masofa vector<long long> dp(K, INF); dp[a%K] = 0; for (int g = a/K; g < b/K; ++g) { vector<long long> next_dp(K, INF); for (int i = 0; i < K; ++i) { if (dp[i] == INF) continue; for (int j = 0; j < K; ++j) { next_dp[j] = min(next_dp[j], dp[i] + adj[g].mat[i][j]); } } dp = next_dp; } long long result = dp[b%K]; if (result >= INF) cout << -1 << endl; else cout << result << endl; } return 0; }
#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...