답안 #683770

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
683770 2023-01-19T10:22:19 Z speedyArda Jakarta Skyscrapers (APIO15_skyscraper) C++14
0 / 100
2 ms 2388 KB
#include "bits/stdc++.h"

using namespace std;
using ll = long long;
const ll MAXN = 3e4+5;

vector<set< ll> > adj(MAXN);
vector< vector <  ll > > doges(MAXN);
ll dp[MAXN];
map< pair<ll, ll>, bool > done;
bool visited[MAXN];
int main() 
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    ll n, m;
    cin >> n >> m;
    ll goal, begin;
    for(ll i = 0; i < m; i++)
    {
        pair<ll, ll> temp;
        cin >> temp.first >> temp.second;
        if(i == 1)
            goal = temp.first;
        else if(i == 0)
            begin = temp.first;
        doges[temp.first].push_back(temp.second);
    }

    for(ll i = 0; i <= n; i++) {
        dp[i] = 1e9;
        visited[i] = false;
    }
    visited[begin] = false;
    dp[begin] = 0;
    set< pair<ll, ll> > curr; 
    curr.insert({0, begin});
    ll ans =  1e9;
    while(!curr.empty())
    {
        pair<ll, ll> temp = *(curr.begin());
        ll v = temp.second;
        ll len = temp.first;
       // cout << v << "\n";
        curr.erase(curr.begin());
        if(v == goal)
            ans = min(len, ans);
        if(!visited[v]) // Add its edges
        {
            for(ll doge : doges[v])
            {
                //if(v == 4)
                   // cout << doge << "\n";  
                //if(done[{v, doge}])
                    //continue;
                ll curr = v;
                ll cnt = 1;
                while(curr + doge < n)
                {
                    if(done[{curr, curr + doge}])
                        break;
                    done[{curr, curr + doge}] = true;
                    adj[curr].insert(curr + doge);
                    curr += doge;
                    //cnt++;
                }
                curr = v;
                while(curr - doge >= 0)
                {
                    
                    if(done[{curr, curr - doge}])
                        break;
                    //if(v == 4)
                        //cout << curr << "\n";
                    done[{curr, curr - doge}] = true;
                    adj[curr].insert(curr - doge);
                    curr -= doge;
                    //cnt++;
                }
            }
        }

        visited[v] = true;

        for(ll e : adj[v])
        {
            if(dp[e] > len + 1)
            {
                curr.erase({dp[e], e});
                dp[e] = len + 1;
                curr.insert({dp[e], e});
            }
        }
        adj[v].clear();
        
        //dp[v] = 1e9;

    }

    if(ans == 1e9)
        ans = -1;
    cout << ans << "\n";

}

Compilation message

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:57:20: warning: unused variable 'cnt' [-Wunused-variable]
   57 |                 ll cnt = 1;
      |                    ^~~
skyscraper.cpp:46:9: warning: 'goal' may be used uninitialized in this function [-Wmaybe-uninitialized]
   46 |         if(v == goal)
      |         ^~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 2388 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 2388 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 2388 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 2388 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 2388 KB Output isn't correct
2 Halted 0 ms 0 KB -