답안 #516196

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
516196 2022-01-20T15:19:41 Z CaoHuuKhuongDuy Jakarta Skyscrapers (APIO15_skyscraper) C++14
0 / 100
2 ms 1100 KB
// #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}});
    } 
             //cout<<u<<" "<<step<<" "<<dp[u][step]<<" "<<cu<<endl;
       //  cout<<u<<" "<<step<<" "<<dp[u-step][step]<<" "<<cu<<endl;

    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 a[mxn];
int main(){
    giuncute();
    #ifndef ONLINE_JUDGE
  //  OF();
  freopen("test.inp","r",stdin);
    #endif
    cin >> n >> m;
    lp(i, 0, m-1){
        static ll u, p;
        cin >> u >> p;
        a[i]=u;
        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[a[0]][i] = 0;
    q.push({0, {a[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)
            {
             // cout<<u-i<<" "<<dp[u-i][i]<<endl;
              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[a[1]][i]);
    if(ans ==1e9) ans = -1;
    cout << ans;
}

Compilation message

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:80:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   80 |   freopen("test.inp","r",stdin);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 972 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 1100 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 1100 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 1100 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 1100 KB Output isn't correct
2 Halted 0 ms 0 KB -