Submission #1058956

#TimeUsernameProblemLanguageResultExecution timeMemory
1058956shenfe1Ancient Books (IOI17_books)C++17
100 / 100
238 ms129112 KiB
#include <bits/stdc++.h> #include "books.h" #pragma GCC optimize("Ofast") using namespace std; #define pb push_back #define pii pair<int,int> #define sz(s) (int)s.size() #define F first #define S second #define all(v) v.begin(),v.end() #define ll long long #define lb lower_bound const int MAX=1e6+10; const ll inf=1e18; int n; vector<int> g[MAX]; bool use[MAX]; vector<int> vec; int pref[MAX]; struct dsu{ int f[MAX]; void init(int n){ for(int i=0;i<n;i++)f[i]=i; } int get(int v){ return (f[v]==v?v:f[v]=get(f[v])); } void unite(int a,int b){ a=get(a),b=get(b); f[a]=b; } }d; int num[MAX]; int prefz[MAX]; bool is(int l,int r,vector<int> x){ for(int pos:x){ if(l<=pos&&pos<=r)return 1; } return 0; } int get(int l,int r){ if(l==0)return prefz[r]; return prefz[r]-prefz[l-1]; } ll minimum_walk(vector<int> p,int s){ n=sz(p); int Lneed=0,Rneed=n-1; ll ans=0; for(int i=0;i<n;i++){ ans+=abs(i-p[i]); } vector<vector<int>> x; vector<pii> seg,bds; for(int i=0;i<n;i++){ if(!use[i]){ vec.clear(); int v=i; while(!use[v]){ num[v]=sz(seg); vec.pb(v); use[v]=1; v=p[v]; } sort(all(vec)); seg.pb({vec[0],vec.back()}); int l=0,r=n-1; for(int f:vec){ if(f<=s)l=f; else{ r=f; break; } } bds.pb({l,r}); x.pb(vec); } } d.init(n); vector<int> pref(n,0); for(int i=0;i<sz(seg);i++){ auto &[l,r]=seg[i]; if(l<=s&&s<=r&&i!=num[s]){ continue; } pref[l]++; pref[r]--; } for(int i=1;i<n;i++)pref[i]+=pref[i-1]; prefz[0]=(pref[0]==0); for(int i=1;i<n;i++){ // if(pref[i]==0)cout<<i<<"\n"; prefz[i]=prefz[i-1]+(pref[i]==0); } int cur=0; int L=s,R=s; set<pii> sl,sr; for(int i=0;i<sz(seg);i++){ auto [l,r]=seg[i]; if(l<s&&s<r&&i!=num[s]){ // cout<<i<<"\n"; // cout<<l<<" "<<r<<"\n"; sl.insert({bds[i].F,i}); sr.insert({bds[i].S,i}); } } while(R-L+1!=n){ while(L-1>=0&&pref[L-1]!=0)L--; while(R+1<n&&pref[R]!=0)R++; bool ok=0; // cout<<L<<" "<<R<<"\n"; while(!sl.empty()&&L<=sl.rbegin()->F&&sl.rbegin()->F<=R){ ok=1; int i=sl.rbegin()->S; sl.erase(--sl.end()); sr.erase({bds[i].S,i}); L=min(L,seg[i].F); R=max(R,seg[i].S); } while(!sr.empty()&&L<=sr.begin()->F&&sr.begin()->F<=R){ ok=1; int i=sr.begin()->S; sr.erase(sr.begin()); sl.erase({bds[i].F,i}); L=min(L,seg[i].F); R=max(R,seg[i].S); } if(!ok){ int mn=n+10,pos=-1; if(!sl.empty()){ if(get(sl.rbegin()->F,L-1)<mn){ mn=get(sl.rbegin()->F,L-1); pos=sl.rbegin()->S; } } if(!sr.empty()){ if(get(R,sr.begin()->F-1)<mn){ mn=get(R,sr.begin()->F-1); pos=sr.begin()->S; } } if(pos!=-1){ ok=1; ans+=2*mn; L=seg[pos].F,R=seg[pos].S; sl.erase({bds[pos].F,pos}); sr.erase({bds[pos].S,pos}); } } while(L-1>=0&&pref[L-1]!=0)L--; while(R+1<n&&pref[R]!=0)R++; if(!ok){ if(L-1>=0){ L--; ans+=2; } if(R+1<n){ R++; ans+=2; } } } for(int i=0;i<s;i++){ if(p[i]==i)ans-=2; else break; } for(int i=n-1;i>s;i--){ if(p[i]==i)ans-=2; else break; } return ans; }

Compilation message (stderr)

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:60:9: warning: unused variable 'Lneed' [-Wunused-variable]
   60 |     int Lneed=0,Rneed=n-1;
      |         ^~~~~
books.cpp:60:17: warning: unused variable 'Rneed' [-Wunused-variable]
   60 |     int Lneed=0,Rneed=n-1;
      |                 ^~~~~
books.cpp:107:9: warning: unused variable 'cur' [-Wunused-variable]
  107 |     int cur=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...