Submission #472052

#TimeUsernameProblemLanguageResultExecution timeMemory
472052hhhhauraJakarta Skyscrapers (APIO15_skyscraper)C++14
22 / 100
109 ms168900 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 = 6000000; const int K = 174; int n, m, st, ed, ii; vector<int> dis, s; vector<vector<pair<short, bool>>> mp; vector<vector<vector<short>>> a; void init_(int _n, int _m) { n = _n, m = _m, ii = n - 1; s.clear(); dis.assign(P, INF); mp.assign(P, vector<pair<short, bool>>()); rep(i, 0, K - 1) a.push_back(vector<vector<short>>(i, vector<short>())); } void get_new() { ii++; if(ii >= P) exit(0); } 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<short> &v = a[i][j]; int id = -1; for(int k = j; k < n; k += i) { get_new(); while(id + 1 < v.size() && v[id + 1] <= k) id ++; if(id >= 0 && 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); if(i.first == ed) return dis[ed]; } } 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;}
      |                     ^~~~
skyscraper.cpp: In function 'int solver::solve()':
skyscraper.cpp:67:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<short int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |     while(id + 1 < v.size() && v[id + 1] <= k) id ++;
      |           ~~~~~~~^~~~~~~~~~
#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...