제출 #70365

#제출 시각아이디문제언어결과실행 시간메모리
70365gnoorAncient Books (IOI17_books)C++17
12 / 100
3 ms764 KiB
#include "books.h" #include <vector> #include <algorithm> #include <cmath> #include <cassert> using namespace std; bool visit[1000100]; long long minimum_walk(vector<int> p, int s) { int n=(int)p.size(); vector<pair<int,int>> coord; long long ans=0; for (int i=0;i<n;i++) { if (visit[i]) continue; visit[i]=true; int mn=i; int mx=i; int cur=p[i]; ans+=abs(p[i]-i); while (cur!=i) { visit[cur]=true; mx=max(mx,cur); mn=min(mn,cur); ans+=abs(p[cur]-cur); cur=p[cur]; } if (mn!=mx) coord.push_back({mn,mx}); } coord.push_back({s,s}); sort(coord.begin(),coord.end(),[](const pair<int,int> &a,const pair<int,int> &b) { if (a.second!=b.second) return a.second<b.second; return a.first<b.first; }); vector<pair<int,int>> re; for (int i=0;i<(int)coord.size();i++) { int curl=coord[i].first; //if (!re.empty()&&coord[i].second==re.back().second) continue; while (!re.empty()&&coord[i].first<=re.back().second) { curl=min(curl,re.back().first); re.pop_back(); } re.push_back({curl,coord[i].second}); } for (int i=1;i<(int)re.size();i++) { assert(re[i].first-re[i-1].second==1); ans+=(re[i].first-re[i-1].second)*2; } return ans; }
#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...