Submission #422845

#TimeUsernameProblemLanguageResultExecution timeMemory
4228452fat2codeAncient Books (IOI17_books)C++17
50 / 100
270 ms63620 KiB
#include "books.h" #include<bits/stdc++.h> #define fr first #define sc second #define all(s) s.begin(), s.end() using namespace std; const int nmax = 1000005; long long n, ans = 0, viz[nmax], comp = 0, cost, diff = 1e18, el = 0; vector<pair<long long,long long>>ranges; vector<long long>nod[nmax]; long long minimum_walk(vector<int> p, int s) { n = (int)p.size(); for(int i=0;i<n;i++){ ans += abs(p[i] - i); } for(int i=s;i>=0;i--){ if(p[i] != i){ if(abs(s-i) < diff){ diff = abs(i - s); el = i; } } } for(int i=s;i<n;i++){ if(p[i] != i){ if(abs(s-i) < diff){ diff = abs(i - s); el = i; } } } s = el; if(diff == 1e18) diff = 0; for(int i=0;i<n;i++){ if(!viz[i]){ int maxi = i, mini = i; comp++; viz[i] = comp; int curr = p[i]; while(curr != i){ viz[curr] = comp; maxi = max(maxi, curr); mini = min(mini, curr); curr = p[curr]; } ranges.push_back({mini, maxi}); } } while(ranges.size() && ranges.back().fr == ranges.back().sc && ranges.back().sc > s){ ranges.pop_back(); } reverse(all(ranges)); while(ranges.size() && ranges.back().fr == ranges.back().sc && ranges.back().sc < s){ ranges.pop_back(); } sort(all(ranges)); deque<pair<long long,long long>>Q; for(auto it : ranges){ Q.push_back(it); } queue<pair<long long, long long>>rn; while(Q.size()){ cost += 2; rn.push(Q.front()); Q.pop_front(); while(rn.size()){ auto it = rn.front(); rn.pop(); while(Q.size() && Q.front().fr <= it.sc){ rn.push(Q.front()); Q.pop_front(); } } } cost -= 2LL; return ans + cost + diff * 2LL; }
#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...