Submission #294940

#TimeUsernameProblemLanguageResultExecution timeMemory
294940amoo_safarAncient Books (IOI17_books)C++17
100 / 100
364 ms36104 KiB
#include "books.h" #include <bits/stdc++.h> #define pb push_back #define F first #define S second #define all(x) x.begin(), x.end() using namespace std; typedef pair<int, int> pii; typedef long long ll; const int N = 1e6 + 10; int mk[N], mk2[N]; int L[N], R[N]; //int mn[N][N], mx[N][N]; //ll dp[N][N]; ll minimum_walk(vector<int> p, int s) { int n = p.size(); ll ans = 0; ll near = n; for(int i = 0; i < n; i++){ if(p[i] != i){ ans += abs(p[i] - i); } else { //mk[i] = 1; R[i] = i; L[i] = i; } } cerr << "# " << ans << '\n'; mk[s] = 0; int st = 0, en = n - 1; while(p[st] == st && st < s){ mk[st] = 1; st ++; } while(p[en] == en && en > s){ mk[en] = 1; en --; } int com = 0; vector<pii> seg; for(int i = st; i < en; i++){ if(mk[i]) continue; com ++; vector<int> vis; int nw = i; while(!mk[nw]){ mk[nw] = 1; vis.pb(nw); nw = p[nw]; } sort(all(vis)); seg.pb({vis[0], vis.back()}); for(auto x : vis) L[x] = vis[0]; for(auto x : vis) R[x] = vis.back(); } if(com == 0) return 0; sort(all(seg)); int mxr = st; for(int i = 0; i < (int)seg.size(); i++){ if(mxr < seg[i].F) mk2[mxr] = 1, ans += 2; mxr = max(mxr, seg[i].S); } mk2[mxr] = 1; /* for(int i = 0; i < n; i++) mn[i][i] = L[i]; for(int i = 0; i < n; i++) mx[i][i] = R[i]; for(int ln = 1; ln < n; ln ++){ for(int i = 0; i + ln < n; i++){ int j = i + ln; mn[i][j] = min(mn[i][j - 1], mn[i + 1][j]); mx[i][j] = max(mx[i][j - 1], mx[i + 1][j]); } } */ //if(ans == 0) return 0; int nwl = s; int nwr = s; int mxl = L[s]; mxr = R[s]; cerr << ans << '\n'; while(!mk2[nwr]){ /* mxl = L[nwl]; for(int i = nwl; i <= nwr; i ++) mxl = min(mxl, L[i]); mxr = R[nwl]; for(int i = nwl; i <= nwr; i ++) mxr = max(mxr, R[i]); */ //cerr << "! " << nwl << ' ' << nwr << ' ' << l2 << ' ' << r2 << '\n'; int l2 = mxl; int r2 = mxr; if(pii(l2, r2) == pii(nwl, nwr) && !mk2[r2]){ ans += 2; l2 --; r2 ++; } while(nwl > l2){nwl --; mxl = min(mxl, L[nwl]), mxr = max(mxr, R[nwl]);} while(nwr < r2){nwr ++; mxl = min(mxl, L[nwr]), mxr = max(mxr, R[nwr]);} //nwl = l2; //nwr = r2; } return ans; } /* 4 1 0 3 1 2 */

Compilation message (stderr)

books.cpp: In function 'll minimum_walk(std::vector<int>, int)':
books.cpp:25:5: warning: unused variable 'near' [-Wunused-variable]
   25 |  ll near = n;
      |     ^~~~
#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...