제출 #1273426

#제출 시각아이디문제언어결과실행 시간메모리
1273426pvproJakarta Skyscrapers (APIO15_skyscraper)C++20
100 / 100
148 ms116776 KiB
#ifdef LOCAL
#define _GLIBCXX_DEBUG
#else
#pragma GCC optimize("O3,Ofast,unroll-loops")
#endif
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <cstdio>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <bitset>
#include <algorithm>
#include <cmath>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <chrono>
#include <random>
#include <complex>
#include <numeric>
#include <assert.h>
#include <functional>
#include <climits>
#include <cstring>
#include <iterator>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

using ll = long long;
using ld = long double;
using ull = unsigned long long;
using ushort = unsigned short;

#define int ll
#ifndef LOCAL
#define endl "\n"
#endif
#define f first
#define s second
#define vec vector
#define pii pair<int, int>
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define pb push_back
#define mp make_pair
template<typename T1, typename T2>
istream& operator>> (istream &in, pair<T1, T2> &p) { in >> p.f >> p.s; return in; }
template<typename T1, typename T2>
ostream& operator<< (ostream &out, pair<T1, T2> p) { out << "(" << p.f << " " << p.s << ")"; return out; }
#define printv(v) cerr << #v << " "; for (auto &x : v) { cerr << x << " "; } cerr << endl;
#define printvv(v) cerr << #v << " "; for (auto &x : v) { for (auto &y : x) { cerr << y << " "; } cerr << endl; }
#define debug(x) cerr << #x << " " << x << endl;

template<typename T>
istream& operator>> (istream &in, vector<T> &v) {
    for (auto &x : v) {
        in >> x;
    }
    return in;
}
template<typename T>
ostream& operator<< (ostream &out, vector<T> v) {
    for (auto &x : v) {
        out << x << " ";
    }
    return out;
}
template<typename T>
void operator-=(vector<T> &v, int delta) {
    for (auto &x : v) {
        x -= delta;
    }
}
template<typename T>
void operator+=(vector<T> &v, int delta) {
    for (auto &x : v) {
        x += delta;
    }
}

mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());

typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

signed Main();
void Solve();
void PreCalc();

static void run_with_stack_size(signed (*func)(), size_t stsize) {
    char *stack, *send;
    stack = (char *)malloc(stsize);
    send = stack+stsize-16;
    send = (char *)((uintptr_t)send/16*16);
    asm volatile(
            "mov %%rsp, (%0)\n"
            "mov %0, %%rsp\n"
            :
            : "r" (send));
    func();
    asm volatile(
            "mov (%0), %%rsp\n"
            :
            : "r"   (send));
    free(stack);
}


signed main() {
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
    int tStart = clock();
    run_with_stack_size(Main, 1024*1024*1024);
    cout << endl << "execution time : " << (clock() - tStart) / 1e3 << endl;
#else
    ios::sync_with_stdio(false);
    cin.tie(0);
    Main();
#endif
}

signed Main() {
    PreCalc();
    int t = 1;
//    cin >> t;
    int test = 0;
    while (t--) {
        ++test;
#ifdef LOCAL
        cout << "--------- TEST #" << test << " ----------" << endl;
#endif
        Solve();
    }
    return 0;
}

/* This code is praying to GOD for protecting from bugs and "other things" */

void PreCalc() {

}

void Solve() {
    int n, m;
    cin >> n >> m;
    vector<int> b(m), p(m);
    for (int i = 0; i < m; ++i) {
        cin >> b[i] >> p[i];
    }
    priority_queue<pii> q;
    vector<bitset<30001>> has(n);
    vector<vector<int>> moves(n);
    for (int i = 0; i < m; ++i) {
        moves[b[i]].pb(p[i]);
        has[b[i]][p[i]] = 1;
    }
    for (int i = 0; i < n; ++i) {
        sort(all(moves[i]));
    }
    vector<int> d(n, 1e18);
    vector<int> marked(n, 0);
    q.push(mp(0, b[0]));
    d[b[0]] = 0;
    while (!q.empty()) {
        int v = q.top().s;
        q.pop();
        if (marked[v]) {
            continue;
        }
        marked[v] = 1;
        int lst = -1;
        for (auto &x : moves[v]) {
            if (lst == x) {
                continue;
            }
            lst = x;
            int k = 1;
            while (v + k * x < n) {
                if (d[v + k * x] > d[v] + k) {
                    d[v + k * x] = d[v] + k;
                    q.push(mp(-d[v + k * x], v + k * x));
                }
                if (has[v + k * x][x]) {
                    break;
                }
                ++k;
            }
            k = 1;
            while (v - k * x >= 0) {
                if (d[v - k * x] > d[v] + k) {
                    d[v - k * x] = d[v] + k;
                    q.push(mp(-d[v - k * x], v - k * x));
                }
                if (has[v - k * x][x]) {
                    break;
                }
                ++k;
            }
        }
    }
    if (d[b[1]] == 1e18) {
        cout << -1 << endl;
    } else {
        cout << d[b[1]] << endl;
    }

}
#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...