이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
// #pragma GCC target("avx2")
// #pragma GCC optimize("Ofast")
// #pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
#define ll int
#define cll const ll
#define lp(a, b, c) for(ll a = b; a <= c; ++a)
#define lpd(a, b, c) for(ll a = b; a >= c; --a)
#define vec(a) vector<a>
#define pp(a, b) pair<a, b>
#define EACHCASE lpd(cs, read(), 1)
#define Fname "f"
using namespace std;
template <typename T> inline void Read(T &x){
x = 0; char c;
ll dau = 1;
while(!isdigit(c = getchar())) if(c == '-') dau = -1;
do{
x = x * 10 + c - '0';
} while (isdigit(c = getchar()));
x *= dau;
}
ll read(){
ll tmp;
cin >> tmp;
return tmp;
}
void giuncute(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
}
// void OF(){
// if(fopen(Fname".inp", "r")){
// freopen(Fname".inp", "r", stdin);
// freopen(Fname".out", "w", stdout);
// } else if(fopen(Fname".in", "r")){
// freopen(Fname".in", "r", stdin);
// freopen(Fname".out", "w", stdout);
// }
// }
cll mxn = 3e4 + 5, _sqrt = 173;
ll n, m, dp[mxn][_sqrt + 4];
vec(ll) jump[mxn];
priority_queue<pp(ll, pp(ll, ll))> q;
void prc(ll u, ll cu, ll step){
if(u + step < n && dp[u + step][step] > cu + 1){
dp[u + step][step] = cu + 1;
q.push({-dp[u + step][step], {u + step, step}});
}
if(u - step >= 0 && dp[u - step][step] > cu + 1){
dp[u - step][step] = cu + 1;
q.push({-dp[u - step][step], {u - step, step}});
}
// if(u + step < n && dp[u + step][0] > cu + 1){
// dp[u + step][0] = cu + 1;
// q.push({-dp[u + step][0], {u + step, 0}});
// }
// if(u - step >= 0 && dp[u - step][0] > cu + 1){
// dp[u - step][0] = cu + 1;
// q.push({-dp[u - step][0], {u - step, 0}});
// }
}
bool First[mxn];
int main(){
giuncute();
#ifndef ONLINE_JUDGE
// OF();
// freopen("test.inp","r",stdin);
#endif
cin >> n >> m;
lp(i, 1, m){
static ll u, p;
cin >> u >> p;
jump[u].push_back(p);
}
if (n==1)
{
cout<<-1;
return 0;
}
lp(i, 0, n-1) lp(j, 0, _sqrt) dp[i][j] = 1e9;
lp(i, 0, _sqrt) dp[0][i] = 0;
q.push({0, {0, 0}});
while(q.size()){
ll cu = -q.top().first, u = q.top().second.first, step = q.top().second.second;
q.pop();
if(cu != dp[u][step]) continue;
// maintain last step
prc(u, cu, step);
// change step
if (First[u]) continue;
First[u]=true;
for(ll i : jump[u]){
//prc(u,cu-1,i);
if (dp[u][0]>cu)
{
dp[u][0]=cu;
q.push({-dp[u][0],{u,0}});
}
if(i <= _sqrt)
{
if (dp[u][i]>cu)
{
dp[u][i]=cu;
q.push({-dp[u][i],{u,i}});
}
prc(u, cu, i);
}
else{
for(ll v = u + i, cnt = 1; v < n; v += i, ++cnt)
if(dp[v][0] > cu + cnt){
dp[v][0] = cu + cnt;
q.push({-dp[v][0], {v, 0}});
}
for(ll v = u - i, cnt = 1; v >= 0; v -= i, ++cnt)
if(dp[v][0] > cu + cnt){
dp[v][0] = cu + cnt;
q.push({-dp[v][0], {v, 0}});
}
}
}
}
ll ans = 1e9;
lp(i, 0, _sqrt) ans = min(ans, dp[1][i]);
if(ans ==1e9) ans = -1;
cout << ans;
}
# | 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... |