제출 #578455

#제출 시각아이디문제언어결과실행 시간메모리
578455definitelynotmee고대 책들 (IOI17_books)C++98
50 / 100
314 ms97612 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<pii> 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() || cycles.back().ss < r; if(r-i && isgood[i]){ if(cycles.size() && cycles.back().ss > i){ int l = cycles.back().ff; cycles.pop_back(); cycles.push_back({l,r}); } else { cycles.push_back({i,r}); } } } } for(int i = 0; i < (int)cycles.size()-1; i++){ resp+= 2*(cycles[i+1].ff-cycles[i].ss); } if(cycles.empty()) return resp; if(s < cycles[0].ff || s > cycles.back().ss){ resp+=max(cycles[0].ff-s, s-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; }

컴파일 시 표준 에러 (stderr) 메시지

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:78:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   78 |         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...