Submission #935141

#TimeUsernameProblemLanguageResultExecution timeMemory
935141LoboAncient Books (IOI17_books)C++17
12 / 100
18 ms58060 KiB
#include "books.h" #include<bits/stdc++.h> using namespace std; const long long inf = (long long) 1e18 + 10; const int inf1 = (int) 1e9 + 10; #define int long long #define dbl long double #define endl '\n' #define sc second #define fr first #define mp make_pair #define pb push_back #define all(x) x.begin(), x.end() const int maxn = 1e6+10; int n; int ds[maxn], dsz[maxn], dsl[maxn], dsr[maxn]; int nxr[maxn], costr[maxn]; int find(int v) { if(v == ds[v]) return v; return ds[v] = find(ds[v]); } void join(int u, int v) { u = find(u); v = find(v); if(u == v) return; if(dsz[u] < dsz[v]) swap(u,v); dsz[u]+= dsz[v]; dsl[u] = min(dsl[u],dsl[v]); dsr[u] = max(dsr[u],dsr[v]); ds[v] = u; } int L,R; map<int,int> dp[maxn]; int sol(int l, int r) { if(dp[l].count(r)) return dp[l][r]; if(l == L && r == R) return dp[l][r] = 0; dp[l][r] = inf; if(l > L) dp[l][r] = min(dp[l][r],2+sol(dsl[find(l-1)],max(r,dsr[find(l-1)]))); if(r < R) dp[l][r] = min(dp[l][r],2*costr[r+1]+sol(min(l,dsl[find(nxr[r+1])]),dsr[find(nxr[r+1])])); return dp[l][r]; } long long minimum_walk(vector<int32_t> p, int32_t s) { // return 0; n = p.size(); for(int i = 0; i < n; i++) { ds[i] = i; dsz[i] = 1; dsl[i] = i; dsr[i] = i; } for(int i = 0; i < n; i++) { join(i,p[i]); } int itl = s; while(itl != n) { int itr = itl; int cur = itl; while(cur <= itr) { itr = max(itr,dsr[find(cur)]); cur++; } for(int i = itl; i < itr; i++) { join(i,i+1); } itl = itr+1; } int itr = s; while(itr >= 0) { int itl = itr; int cur = itr; while(cur >= itl) { itl = min(itl,dsl[find(cur)]); cur--; } for(int i = itl; i < itr; i++) { join(i,i+1); } itr = itl-1; } L = 0; R = n-1; while(L < s && dsz[find(L)] == 1) L++; while(R > s && dsz[find(R)] == 1) R--; for(int i = R-1; i >= s; i--) { if(dsl[find(i+1)] < s or dsr[find(i+1)] == R) { nxr[i] = i+1; costr[i] = 1; } else { nxr[i] = nxr[i+1]; costr[i] = costr[i+1]+1; } } int ans = 0; for(int i = 0; i < n; i++) ans+= abs(p[i]-i); return ans+sol(dsl[find(s)],dsr[find(s)]); }
#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...