제출 #73668

#제출 시각아이디문제언어결과실행 시간메모리
73668MKopchev고대 책들 (IOI17_books)C++14
22 / 100
2056 ms20276 KiB
#include<bits/stdc++.h> using namespace std; const int nmax=1e6+42; int in[nmax],out[nmax]; long long minimum_walk(vector<int> p, int s) { int n=p.size(); while(n-1>s&&p[n-1]==n-1){p.pop_back();n--;} vector<int> help={}; int where=0; for(where=0;where<s;where++) { if(p[where]!=where)break; } for(int i=where;i<n;i++) help.push_back(p[i]); p=help; n=p.size(); if(n==0)return 0; for(int i=0;i<n;i++) if(i!=p[i]) { if(i<p[i]) for(int j=i;j<p[i];j++) out[j]++,in[j+1]++; else for(int j=i;j>p[i];j--) out[j]++,in[j-1]++; } /* for(int i=0;i<n;i++) cout<<in[i]<<" "<<out[i]<<endl; */ int maxi=0; for(int i=0;i<n;i++) { maxi=max(maxi,p[i]); if(i==maxi) { if(i!=n-1) { in[i]++; out[i]++; in[i+1]++; out[i+1]++; } maxi=0; } } for(int i=1;i<n;i++) { if(in[i-1]<out[i-1]) { out[i]+=out[i-1]-in[i-1]; out[i-1]=in[i-1]; } else//in[i-1]>out[i-1] { in[i]+=in[i-1]-out[i-1]; in[i-1]=out[i-1]; } } assert(in[n-1]==out[n-1]); long long ans=0; for(int i=0;i<n;i++) { ans=ans+in[i]+out[i]; } return ans/2; } /* int main() { //cout<<minimum_walk({0, 2, 3, 1}, 0)<<endl; //cout<<minimum_walk({1,0,3,2}, 0)<<endl; //cout<<minimum_walk({2,3,0,1}, 0)<<endl; return 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...