This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
/// 12:08
const int Nmax = 30005;
const int base = 30007;
vector<int> v[Nmax];
int salt[Nmax], pos[Nmax];
bool reached[Nmax];
int n, m;
unordered_map<int, int> dist;
queue< int > q;
static int code(int x, int y)
{
return x * base + y;
}
static pair<int,int> decode(int x)
{
return {x / base, x % base};
}
static void baga(int x, int curr)
{
reached[x] = 1;
for(auto it : v[x])
{
int cd = code(x, it);
if(!dist[cd])
{
dist[cd] = curr + 1;
q.push(cd);
}
}
}
static int solve()
{
if(pos[0] == pos[1]) return 0;
baga(pos[0], 0);
while(q.size())
{
int x, s;
tie(x, s) = decode(q.front());
q.pop();
int curr = dist[code(x, s)];
int code1, code2;
code1 = code(x+s, s);
code2 = code(x-s, s);
if(x + s < n && !dist[code1])
{
dist[code1] = curr + 1;
q.push(code1);
if(x + s == pos[1]) return curr;
if(!reached[x+s]) baga(x+s, curr);
}
if(x - s >= 0 && !dist[code2])
{
dist[code2] = curr + 1;
q.push(code2);
if(x - s == pos[1]) return curr;
if(!reached[x-s]) baga(x-s, curr);
}
}
return -1;
}
int main()
{
// freopen("input", "r", stdin);
cin.sync_with_stdio(false); cin.tie(0);
cin >> n >> m;
int i;
for(i=0; i<m; ++i)
{
cin >> pos[i] >> salt[i];
v[pos[i]].push_back(salt[i]);
}
for(i=0; i<n; ++i)
{
sort(v[i].begin(), v[i].end());
v[i].erase( unique(v[i].begin(), v[i].end()) , v[i].end() );
}
cout << solve() << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |