제출 #671133

#제출 시각아이디문제언어결과실행 시간메모리
671133NothingXDJakarta Skyscrapers (APIO15_skyscraper)C++17
10 / 100
2 ms1236 KiB
        #include<bits/stdc++.h>
        using namespace std;
         
        typedef long long ll;
        typedef long double ld;
        typedef unsigned long long ull;
        /*typedef __uint128_t L;
        struct FastMod {
          ull b, m;
          FastMod(ull b) : b(b), m(ull((L(1) << 64) / b)) {}
          ull reduce(ull a) {
            ull q = (ull)((L(m) * a) >> 64);
            ull r = a - q * b; // can be proven that 0 <= r < 2*b
            return r >= b ? r - b : r;
          }
        };
        FastMod FM(2);*/
        typedef pair<int,int> pii;
        typedef pair<ll,ll> pll;
         
        void debug_out() { cerr << endl; }
         
        template <typename Head, typename... Tail>
        void debug_out(Head H, Tail... T) {
        	cerr << " " << H;
        	debug_out(T...);
        }
         
        #define debug(...) cerr << "(" << #__VA_ARGS__ << "):", debug_out(__VA_ARGS__)
        #define all(x) x.begin(), x.end()
        #define MP(x, y) make_pair(x, y)
        #define F first
        #define S second
         
        //mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
         
        const int maxn = 3e4 + 10;
         
        int n, m, a[maxn], b[maxn], h[maxn];
        map<pii,bool> mp;
        vector<int> val[maxn];
         
        void dijkstra(int st){
        	memset(h, 63, sizeof h);
        	h[st] = 0;
        	priority_queue<pii, vector<pii>, greater<pii>> q;
        	q.push({0, st});
        	while(!q.empty()){
        		int v = q.top().S, w = q.top().F;
        		q.pop();
        		if (w > h[v]) continue;
        		for (auto x: val[v]){
        			int tmp = v % x;
        			if (mp[{x, tmp}]) continue;
        			mp[{x, tmp}] = true;
        			for (int i = 1; v + i * x < n; i++){
        				int u = v + i * x;
        				if (h[u] > h[v] + i){
        					h[u] = h[v] + i;
        					q.push({h[u], u});
        				}
        			}
        			for (int i = 1; v - i * x >= 0; i++){
        				int u = v - i * x;
        				if (h[u] > h[v] + i){
        					h[u] = h[v] + i;
        					q.push({h[u], u});
        				}
        			}
        		}
        	}
        }
         
        int main(){
        	ios_base::sync_with_stdio(false); cin.tie(0);
         
        	cin >> n >> m;
         
        	for (int i = 1; i <= m; i++){
        		cin >> a[i] >> b[i];
        		val[a[i]].push_back(b[i]);
        	}
         
        	dijkstra(a[1]);
        	cout << (h[a[2]] > n? -1: h[a[2]]) << '\n';
         
        	return 0;
        }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...