Submission #333290

#TimeUsernameProblemLanguageResultExecution timeMemory
333290blueJakarta Skyscrapers (APIO15_skyscraper)C++11
36 / 100
1098 ms2688 KiB
#include <iostream> #include <vector> #include <cmath> #include <algorithm> #include <set> using namespace std; const int MAX_M = 30000; int dist0[MAX_M]; struct doge { int p; }; bool operator < (doge X, doge Y) { if(dist0[X.p] == dist0[Y.p]) return X.p < Y.p; return dist0[X.p] < dist0[Y.p]; } int main() { int N, M; cin >> N >> M; int B[M], P[M]; vector<int> doge_pos[N]; for(int i = 0; i < M; i++) { cin >> B[i] >> P[i]; doge_pos[ B[i] ].push_back(i); } dist0[0] = 0; for(int i = 1; i < M; i++) dist0[i] = 2000000000; set<doge> dogeset; for(int i = 0; i < M; i++) dogeset.insert(doge{i}); while(!dogeset.empty()) { doge g = *dogeset.begin(); dogeset.erase(g); int i = g.p; for(int v = B[i] % P[i]; v < N; v += P[i]) for(int j: doge_pos[v]) if(i != j) { int weight = abs((B[j] - B[i]) / P[i]); if (dist0[j] > dist0[i] + weight) { dogeset.erase(doge{j}); dist0[j] = dist0[i] + weight; dogeset.insert(doge{j}); } } } if(dist0[1] == 2000000000) cout << "-1\n"; else cout << dist0[1] << '\n'; 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...