#include<stdio.h>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#include<math.h>
#include<string.h>
#include<queue>
#include<list>
#include<time.h>
#include<assert.h>
#include<unordered_set>
#define MAX_DIVISOR 128
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<int, ll> pil;
typedef pair<ll, int> pli;
int n, m;
void push(vector<int>* list, int a) {
while (!list->empty() && list->back() < a) {
list->pop_back();
}
list->push_back(a);
}
int b[30000];
int p[30000];
int shortest[30000];
vector<int> building_doge[30000];
vector<vector<int> > div_grid[MAX_DIVISOR+1];
bool visited[30000] = {0, };
bool inSorted[30000] = { 0, };
set<pair<pii, int> > sorted; //count, i, before;
int main() {
scanf("%d %d", &n, &m);
for (int i = 0; i < m; i++) {
scanf("%d %d", b + i, p + i);
}
for (int i = 0; i < m; i++) {
shortest[i] = 0x7FFFFFFF;
}
for (int i = 1; i <= MAX_DIVISOR; i++) {
div_grid[i].assign(i, {});
}
for (int i = 0; i < m; i++) {
building_doge[b[i]].push_back(i);
for (int divisor = 1; divisor <= MAX_DIVISOR; divisor++) {
div_grid[divisor][b[i] % divisor].push_back(i);
}
}
shortest[0] = 0;
inSorted[0] = true;
sorted.insert({{ 0, 0 }, -1});
while (true) {
if (sorted.empty()) { printf("-1"); break; }
pair<pii, int> now = *sorted.begin();
if (now.first.second == 1) {
printf("%d", now.first.first);
break;
}
visited[now.first.second] = true;
if (p[now.first.second] == now.second) continue;
if (p[now.first.second] <= MAX_DIVISOR) {
for (int v : div_grid[p[now.first.second]][b[now.first.second] % p[now.first.second]]) {
if (visited[v]) continue;
int times = (b[v] - b[now.first.second]) / p[now.first.second];
if (times < 0) times = -times;
times += now.first.first;
if (times < shortest[v]) {
if (inSorted[v]) {
sorted.erase( sorted.lower_bound({ {shortest[v], v}, 0 }) );
}
shortest[v] = times;
sorted.insert({ {shortest[v], v}, p[now.first.second] });
inSorted[v] = true;
}
}
}
else {
int i = b[now.first.second] % p[now.first.second];
for (; i < n; i += p[now.first.second]) {
for (int v : building_doge[i]) {
if (visited[v]) continue;
if ((i - b[now.first.second]) % p[now.first.second] == 0) {
int times = (i - b[now.first.second]) / p[now.first.second];
if (times < 0) times = -times;
times += now.first.first;
if (times < shortest[v]) {
if (inSorted[v]) {
sorted.erase(sorted.lower_bound({ {shortest[v], v}, 0 }));
}
shortest[v] = times;
sorted.insert({ {shortest[v], v}, p[now.first.second] });
inSorted[v] = true;
}
}
}
}
}
sorted.erase(sorted.begin());
}
}
Compilation message
skyscraper.cpp: In function 'int main()':
skyscraper.cpp:43:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d", &n, &m);
~~~~~^~~~~~~~~~~~~~~~~
skyscraper.cpp:45:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d", b + i, p + i);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
1280 KB |
Output is correct |
2 |
Correct |
1 ms |
1280 KB |
Output is correct |
3 |
Correct |
1 ms |
1280 KB |
Output is correct |
4 |
Correct |
1 ms |
1280 KB |
Output is correct |
5 |
Correct |
1 ms |
1280 KB |
Output is correct |
6 |
Correct |
1 ms |
1280 KB |
Output is correct |
7 |
Execution timed out |
1084 ms |
1280 KB |
Time limit exceeded |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
1280 KB |
Output is correct |
2 |
Correct |
1 ms |
1280 KB |
Output is correct |
3 |
Correct |
1 ms |
1280 KB |
Output is correct |
4 |
Correct |
2 ms |
1280 KB |
Output is correct |
5 |
Correct |
1 ms |
1280 KB |
Output is correct |
6 |
Correct |
1 ms |
1280 KB |
Output is correct |
7 |
Execution timed out |
1088 ms |
1280 KB |
Time limit exceeded |
8 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
1280 KB |
Output is correct |
2 |
Correct |
1 ms |
1280 KB |
Output is correct |
3 |
Correct |
1 ms |
1280 KB |
Output is correct |
4 |
Correct |
1 ms |
1280 KB |
Output is correct |
5 |
Correct |
1 ms |
1280 KB |
Output is correct |
6 |
Correct |
1 ms |
1280 KB |
Output is correct |
7 |
Execution timed out |
1090 ms |
1280 KB |
Time limit exceeded |
8 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
1280 KB |
Output is correct |
2 |
Correct |
1 ms |
1280 KB |
Output is correct |
3 |
Correct |
1 ms |
1280 KB |
Output is correct |
4 |
Correct |
1 ms |
1280 KB |
Output is correct |
5 |
Correct |
1 ms |
1280 KB |
Output is correct |
6 |
Correct |
1 ms |
1280 KB |
Output is correct |
7 |
Execution timed out |
1084 ms |
1280 KB |
Time limit exceeded |
8 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
1280 KB |
Output is correct |
2 |
Correct |
1 ms |
1280 KB |
Output is correct |
3 |
Correct |
1 ms |
1280 KB |
Output is correct |
4 |
Correct |
1 ms |
1280 KB |
Output is correct |
5 |
Correct |
1 ms |
1280 KB |
Output is correct |
6 |
Correct |
1 ms |
1280 KB |
Output is correct |
7 |
Execution timed out |
1088 ms |
1280 KB |
Time limit exceeded |
8 |
Halted |
0 ms |
0 KB |
- |