Submission #578453

#TimeUsernameProblemLanguageResultExecution timeMemory
578453definitelynotmeeAncient Books (IOI17_books)C++98
12 / 100
1 ms340 KiB
#include<bits/stdc++.h> #include "books.h" using namespace std; #define ff first #define ss second #define all(x) x.begin(), x.end() using ll = long long; using pii = pair<int,int>; using pll = pair<ll,ll>; template<typename T> using matrix = vector<vector<T>>; const int INF = 1e9; long long minimum_walk(std::vector<int> p, int s) { int n = p.size(); ll resp =0; for(int i = 0; i < n; i++){ resp+=abs(i-p[i]); } vector<pii> crange(n); vector<int> cycle(n), check(n); auto dfs = [&](int id, int cid, auto dfs)->int{ cycle[id] = cid; check[id] = 1; if(check[p[id]]) return id; return max(id,dfs(p[id],cid,dfs)); }; vector<int> isgood(n); vector<int> cycles; for(int i = 0; i < n; i++){ if(!check[i]){ int r = dfs(i,i,dfs); crange[i] = {i,r}; isgood[i] = cycles.empty() || crange[cycles.back()].ss < i; if(r-i && isgood[i]) cycles.push_back(i); } } for(int i = 0; i < (int)cycles.size()-1; i++){ resp+= 2*(crange[cycles[i+1]].ff-crange[cycles[i]].ss); } if(cycles.empty()) return resp; if(s < crange[cycles[0]].ff || s > crange[cycles.back()].ss){ resp+=max(crange[cycles[0]].ff-s, s-crange[cycles.back()].ss)*2; return resp; } matrix<pii> g(n); for(int i = 0; i < n; i++){ int cur = cycle[i]; if(i!=n-1) g[cur].push_back({cycle[i+1], crange[cur].ss >= i+1 ? 0 : 2}); if(i) g[cur].push_back({cycle[i-1], crange[cur].ff <= i-1 ? 0 : 2}); } priority_queue<pii,vector<pii>,greater<pii>> pq; vector<int> dist(n,INF); pq.push({0,cycle[s]}); dist[cycle[s]] = 0; while(!pq.empty()){ int cur = pq.top().ff, curp = pq.top().ss; pq.pop(); if(curp> dist[cur]) continue; for(auto [viz,vizp] : g[cur]){ if(dist[viz] > vizp+dist[cur]){ dist[viz]= vizp+dist[cur]; pq.push({viz,dist[viz]}); } } } int add = INF; for(int i = 0; i < n; i++){ if(isgood[i]) add = min(add,dist[i]); } resp+=add; return resp; }

Compilation message (stderr)

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:71:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   71 |         for(auto [viz,vizp] : g[cur]){
      |                  ^
#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...