제출 #1273427

#제출 시각아이디문제언어결과실행 시간메모리
1273427pvproJakarta Skyscrapers (APIO15_skyscraper)C++20
57 / 100
1100 ms113908 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]) { 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...