Submission #472033

#TimeUsernameProblemLanguageResultExecution timeMemory
472033hhhhauraJakarta Skyscrapers (APIO15_skyscraper)C++14
57 / 100
1099 ms209788 KiB
#define wiwihorz #include <bits/stdc++.h> #pragma GCC optimize("Ofast") #pragma loop-opt(on) #define rep(i, a, b) for(int i = a; i <= b; i ++) #define rrep(i, a, b) for(int i = b; i >= a; i --) #define all(x) x.begin(), x.end() #define ceil(a, b) ((a + b - 1) / (b)) #define INF 1000000000 #define MOD 1000000007 #define eps (1e-9) using namespace std; #define lld long double #define pii pair<int, int> #define random mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count()) #ifdef wiwihorz #define print(a...) cerr << "Line " << __LINE__ << ": ", kout("[" + string(#a) + "] = ", a) void vprint(auto L, auto R) {while(L < R) cerr << *L << " \n"[next(L) == R], ++L;} void kout() { cerr << endl; } template<class T1, class ... T2> void kout(T1 a, T2 ... e) { cerr << a << " ", kout(e...); } #else #define print(...) 0 #define vprint(...) 0 #endif namespace solver { const int P = 10000000; const int K = 180; int n, m, st, ed, ii; vector<int> dis, s; vector<vector<pii>> mp; vector<vector<vector<int>>> a; void init_(int _n, int _m) { n = _n, m = _m, ii = n - 1; s.clear(); dis.assign(n, INF); mp.assign(n, vector<pii>()); a.assign(K, vector<vector<int>>(K, vector<int>())); } void get_new() { mp.push_back(vector<pii>()); dis.push_back(INF); ii++; } void add_node(int pos, int b) { for(int i = pos % b; i < n; i += b) { get_new(); if(i == pos) mp[i].push_back({ii, 0}); if(i != pos % b) { mp[ii].push_back({ii - 1, 1}); mp[ii - 1].push_back({ii, 1}); } mp[ii].push_back({i, 0}); } } int solve() { rep(i, 1, K - 1) rep(j, 0, i - 1) { if(!a[i][j].size()) continue; sort(all(a[i][j])); vector<int> v = a[i][j]; for(int k = j; k < n; k += i) { get_new(); int id = lower_bound(all(v), k) - v.begin(); if(v[id] == k) mp[k].push_back({ii, 0}); if(k != j) { mp[ii].push_back({ii - 1, 1}); mp[ii - 1].push_back({ii, 1}); } mp[ii].push_back({k, 0}); } } dis[st] = 0; deque<int> q; q.push_back(st); while(q.size()) { int cur = q.front(); q.pop_front(); for(auto i : mp[cur]) if(dis[i.first] == INF) { dis[i.first] = i.second + dis[cur]; if(i.second) q.push_back(i.first); else q.push_front(i.first); } } return (dis[ed] == INF ? -1 : dis[ed]); } }; using namespace solver; signed main() { ios::sync_with_stdio(false), cin.tie(0); int n, m, b, p; cin >> n >> m; init_(n, m); rep(i, 0, m - 1) { cin >> b >> p; if(i == 0) st = b; if(i == 1) ed = b; if(p >= K) add_node(b, p); else a[p][b % p].push_back(b); } cout << solve() << "\n"; return 0; }

Compilation message (stderr)

skyscraper.cpp:4: warning: ignoring '#pragma loop ' [-Wunknown-pragmas]
    4 | #pragma loop-opt(on)
      | 
skyscraper.cpp:23:13: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   23 | void vprint(auto L, auto R) {while(L < R) cerr << *L << " \n"[next(L) == R], ++L;}
      |             ^~~~
skyscraper.cpp:23:21: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   23 | void vprint(auto L, auto R) {while(L < R) cerr << *L << " \n"[next(L) == R], ++L;}
      |                     ^~~~
#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...