Submission #993167

#TimeUsernameProblemLanguageResultExecution timeMemory
993167boris_mihovTrain (APIO24_train)C++17
5 / 100
1092 ms950628 KiB
#include "train.h" #include <algorithm> #include <iostream> #include <numeric> #include <cassert> #include <vector> #include <queue> typedef long long llong; const int MAXN = 100000 + 10; const llong INF = 4e18; const int INTINF = 2e9; int n, m, w; struct Edge { int from; int to; int cost; int begTime; int endTime; }; Edge edges[MAXN]; struct Interval { int from, to, cost; }; std::vector <std::pair <int,int>> intervals; std::vector <std::pair <int,llong>> g[MAXN]; std::vector <int> begining[MAXN]; std::vector <int> ending[MAXN]; llong dist[MAXN]; bool vis[MAXN]; int t[MAXN]; long long solve(int N, int M, int W, std::vector<int> T, std::vector<int> X, std::vector<int> Y, std::vector<int> A, std::vector<int> B, std::vector<int> C, std::vector<int> L, std::vector<int> R) { n = N; m = M; w = W; for (int i = 0 ; i < m ; ++i) { X[i]++; Y[i]++; edges[i + 1] = {X[i], Y[i], C[i], A[i], B[i]}; begining[X[i]].push_back(i + 1); ending[Y[i]].push_back(i + 1); } for (int i = 1 ; i <= n ; ++i) { t[i] = T[i - 1]; } for (int i = 0 ; i < w ; ++i) { intervals.push_back({L[i], R[i]}); } for (int i = 1 ; i <= n ; ++i) { for (const int &from : ending[i]) { for (const int &to : begining[i]) { if (edges[from].endTime <= edges[to].begTime) { int count = 0; for (const auto &[l, r] : intervals) { count += (edges[from].endTime < l && r < edges[to].begTime); } g[from].push_back({to, 1LL * count * t[i] + edges[to].cost}); } } } } std::fill(dist + 1, dist + 1 + m, INF); std::priority_queue <std::pair <llong,int>> pq; for (const int &idx : begining[1]) { int count = 0; for (const auto &[l, r] : intervals) { count += (r < edges[idx].begTime); } dist[idx] = edges[idx].cost + 1LL * count * t[1]; pq.push({-dist[idx], idx}); } while (pq.size()) { auto [d, node] = pq.top(); pq.pop(); if (vis[node]) { continue; } vis[node] = true; for (const auto &[u, ed] : g[node]) { if (dist[u] > dist[node] + ed) { dist[u] = dist[node] + ed; pq.push({-dist[u], u}); } } } llong min = INF; for (const auto &idx : ending[n]) { int count = 0; for (const auto &[l, r] : intervals) { count += (edges[idx].endTime < l); } min = std::min(min, dist[idx] + 1LL * t[n] * count); } if (min == INF) return -1; return min; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...