Submission #566343

#TimeUsernameProblemLanguageResultExecution timeMemory
566343sofapudenAncient Books (IOI17_books)C++14
12 / 100
1 ms340 KiB
#include "books.h" #include<bits/stdc++.h> using namespace std; typedef long long ll; ll minimum_walk(vector<int> p, int s) { ll su = 0; int mx = 0; int n = p.size(); vector<int> vis(n,0); vector<int> cnt(n+1,0); ll ans = 0; int cn = 0; vector<vector<int>> gr(n+1); for(int i = 0; i < n; ++i){ if(!vis[i]){ cn++; while(!vis[i]){ ans+=abs(i-p[i]); vis[i] = cn; cnt[cn]++; i = p[i]; } } } int dif = 0; vector<int> cnt2(n+1,0); bool st = 0; int ls = 0; pair<int,int> inter; for(int i = 0; i < n; ++i){ if(i == s)st = 1, mx = i; if(!cnt2[vis[i]]++)dif++; if(cnt2[vis[i]] == cnt[vis[i]])dif--; if(!dif){ if(i >= s && ls <= s)inter = {ls,i}; ls = i+1; ans+=2*st; } else mx = i+1, st = 1; } vector<pair<int,int>> segs(n+1,{n,0}); for(int i = 0; i < n; ++i){ segs[vis[i]].first = min(segs[vis[i]].first,i); segs[vis[i]].second = max(segs[vis[i]].second,i); } int l = s, r = s; queue<int> Q; Q.push(s); while(Q.size()){ auto x = Q.front(); Q.pop(); for(int i = segs[vis[x]].first; i < l; ++i)Q.push(i); for(int i = r+1; i <= segs[vis[x]].second; ++i)Q.push(i); l = min(l,segs[vis[x]].first); r = max(r,segs[vis[x]].second); } ans-=2*(make_pair(l,r)!=segs[vis[s]]); return ans-2*(n-mx); }

Compilation message (stderr)

books.cpp: In function 'll minimum_walk(std::vector<int>, int)':
books.cpp:9:5: warning: unused variable 'su' [-Wunused-variable]
    9 |  ll su = 0;
      |     ^~
#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...