Submission #1275768

#TimeUsernameProblemLanguageResultExecution timeMemory
1275768PooyaDaftarianJakarta Skyscrapers (APIO15_skyscraper)C++20
0 / 100
1 ms576 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> pii;
typedef long double ld;

#define all(x) x.begin(), x.end()
#define fast_io ios_base::sync_with_stdio(0); cin.tie(0)
#define endl '\n'
#define pb push_back
#define out(x) {cout << x << '\n'; return;}
#define ff first
#define ss second
#define sz(x) (int)(x).size()
#define int ll

const int maxn = 1e5+7, inf = 1e18;
vector<int> dg[maxn];
int b[maxn], p[maxn], dist[maxn];

bool cmp(int u, int v) {return p[u] < p[v];}
bool mcp(int u, int v) {return p[u] == p[v];}

int32_t main(){
    fast_io;
    int n, m; cin >> n >> m;
    for (int i = 0 ; i < m ; i++)
        cin >> b[i] >> p[i], dg[b[i]].pb(i);
    for (int i = 0 ; i < n ; i++)
        sort(all(dg[i]), cmp), dg[i].erase(unique(all(dg[i]), mcp), dg[i].end());
    for (int i = 0 ; i < n+m ; i++) dist[i] = inf;
    priority_queue<pii, vector<pii>, greater<pii>> q;
    dist[0] = 0, q.push({0, 0});
    while (!q.empty()){
        auto [d, v] = q.top(); q.pop();
        if (d != dist[v]) continue;
        if (v < m){
            for (int i = b[v] ; i < n ; i += p[v]){
                int u = i + m;
                if (dist[v] + (i-b[v])/p[v] < dist[u])
                    dist[u] = dist[v] + (i-b[v])/p[v], q.push({dist[u], u});
            }
            for (int i = b[v] - p[v] ; i >= 0 ; i -= p[v]){
                int u = i + m;
                if (dist[v] + (b[v]-i)/p[v] < dist[u])
                    dist[u] = dist[v] + (b[v]-i)/p[v], q.push({dist[u], u});
            }
        } else {
            for (auto u : dg[v-m])
                if (dist[v] < dist[u])
                    dist[u] = dist[v], q.push({dist[u], u});
            dg[v-m].clear();
        }
    }
    cout << (dist[1] == inf ? -1 : dist[1]) << endl;
    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...