Submission #616182

#TimeUsernameProblemLanguageResultExecution timeMemory
616182rrrr10000Ancient Books (IOI17_books)C++14
100 / 100
224 ms42836 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> P; typedef vector<ll> vi; typedef vector<vi> vvi; typedef vector<P> vp; typedef vector<vp> vvp; typedef vector<bool> vb; #define rep(i,n) for(ll i=0;i<(ll)(n);i++) #define REP(i,k,n) for(ll i=(ll)(k);i<(ll)(n);i++) #define all(a) a.begin(),a.end() #define fi first #define se second #define lb(v,k) (lower_bound(all(v),k)-v.bein()) #define dupli(a) {sort(all(a));a.erase(unique(all(a)),a.end());} #define pb emplace_back template<class T> bool chmin(T&a,T b){if(a>b){a=b;return true;}return false;} template<class T> bool chmax(T&a,T b){if(a<b){a=b;return true;}return false;} template<class T> void out(T a){cout<<a<<endl;} template<class T> void outv(T v){rep(i,v.size()){if(i)cout<<' ';cout<<v[i];}cout<<endl;} const ll inf=1001001001001001001; long long minimum_walk3(std::vector<int> p, int s) { ll l=0,r=p.size()-1; while(l<s&&p[l]==l)l++; while(r>s&&p[r]==r)r--; vi v; REP(i,l,r+1)v.pb(p[i]-l); s-=l; ll n=v.size(),ans=0; rep(i,n-1){ rep(j,i+1)if(v[j]>i)ans++; } vvi dp(n,vi(n,inf)); dp[s][s]=0; for(ll l=s;l>=0;l--){ ll mi=inf,ma=-inf; REP(r,l,n){ chmax(ma,v[r]); chmin(mi,v[r]); if(l)chmin(dp[l-1][r],dp[l][r]+1); if(r!=n-1)chmin(dp[l][r+1],dp[l][r]+1); chmin(dp[min(l,mi)][max(r,ma)],dp[l][r]); } } return (ans+dp[0][n-1])*2; } long long minimum_walk(std::vector<int> p, int s) { ll l=0,r=p.size()-1; while(l<s&&p[l]==l)l++; while(r>s&&p[r]==r)r--; vi v; REP(i,l,r+1)v.pb(p[i]-l); s-=l; ll n=v.size(),ans=0; rep(i,n)ans+=max(0ll,v[i]-i); deque<ll> deq; vi dis(n,inf);dis[s]=0; deq.pb(s); while(deq.size()){ ll i=deq.front();deq.pop_front(); if(i<s&&chmin(dis[i+1],dis[i]))deq.push_front(i+1); if(i>s&&chmin(dis[i-1],dis[i]))deq.push_front(i-1); if(chmin(dis[v[i]],dis[i]))deq.push_front(v[i]); if(i<n-1&&chmin(dis[i+1],dis[i]+1))deq.pb(i+1); if(i>0&&chmin(dis[i-1],dis[i]+1))deq.pb(i-1); } vi al(1,-1),ar(1,n); { ll ma=0; rep(i,s){ chmax(ma,v[i]); if(ma==i)al.pb(i); } } { ll mi=n-1; for(int i=n-1;i>s;i--){ chmin(mi,v[i]); if(mi==i)ar.pb(i); } } ans+=al.size()+ar.size()-2; ans+=dis[al.back()+1]; return ans*2; }
#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...