Submission #935135

#TimeUsernameProblemLanguageResultExecution timeMemory
935135LoboAncient Books (IOI17_books)C++17
42 / 100
77 ms16424 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 = 1e3+10; int n; int ds[maxn], dsz[maxn], dsl[maxn], dsr[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+sol(min(l,dsl[find(r+1)]),dsr[find(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--; 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...