Submission #109518

#TimeUsernameProblemLanguageResultExecution timeMemory
109518updown1Ancient Books (IOI17_books)C++17
12 / 100
3 ms384 KiB
#include "books.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; #define For(i, a, b) for(int i=a; i<b; i++) #define ffi For(i, 0, N) #define ffj For(j, 0, M) #define ffa ffi ffj //#define s <<" "<< #define w cout #define e "\n" #define pb push_back #define mp make_pair #define a first #define b second //#define int ll const int MAXN = 1000000; //Global Variables ll N, out = 0, loc[MAXN], comp[MAXN], at = 0, cost[MAXN]; pair<int, int> rng[MAXN]; bool vis[MAXN], del[MAXN]; void go1(int at, int co) { if (comp[at] != -1) return; rng[co].a = min(rng[co].a, at); rng[co].b = max(rng[co].b, at); comp[at] = co; cost[co] += abs(loc[at]-at); go1(loc[at], co); } void go(int at) { if (vis[at]) return; vis[at] = true; go(loc[at]); } ll minimum_walk(vector<int> p, int s) { N = p.size(); ffi {rng[i] = mp(N, -1); comp[i] = -1; loc[i] = p[i];} ffi if (comp[i] == -1) { go1(i, at); at++; } //For (i, 0, at) w<< cost[i]<<e; sort(rng, rng+at); int far = -1; For (i, 0, at) { if (rng[i].b < far) { //w<<"deleting"<<e; out += cost[comp[rng[i].a]]; del[comp[rng[i].a]] = true;} far = max(far, rng[i].b); } int far_rig = s, far_lef = s; ffi if (loc[i] == i || del[comp[i]]) vis[i] = true; //ffi w<< vis[i]<<e; For (i, s, N) if (!vis[i]) {go(i); far_rig = i; out += cost[comp[i]];} for (int i=s-1; i>=0; i--) if (!vis[i]) {far_lef = i; out += cost[comp[i]];} return out+2*((s-far_lef)+(far_rig-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...