Submission #1133587

#TimeUsernameProblemLanguageResultExecution timeMemory
1133587jerzykAncient Books (IOI17_books)C++20
50 / 100
96 ms15208 KiB
#include <bits/stdc++.h>
#include "books.h"

using namespace std;
#define pb push_back
#define st first
#define nd second
typedef long long ll;
typedef long double ld;
const ll I = 1000'000'000'000'000'000LL;
const int II = 2'000'000'000;
const ll M = 1000'000'007LL;
const int N = 1000'007;
bool vis[N];
int tab[N];
vector<pair<int, int>> inter;

ll minimum_walk(vector<int> _p, int _s)
{
    int n = (int)_p.size();
    ll ans = 0LL;
    for(int i = 0; i < n; ++i)
        tab[i] = _p[i];
    for(int i = 0; i < n; ++i)
    {
        ans += (int)abs(tab[i] - i);
        if(vis[i]) continue;
        int l = i, r = i, v = i;
        while(!vis[v])
        {
            vis[v] = 1;
            l = min(l, v); r = max(r, v);
            v = tab[v];
        }
        if(l != r || l == _s)
            inter.pb(make_pair(l, r));
    }
    sort(inter.begin(), inter.end());
    int cur = 0;
    for(int i = 0; i < (int)inter.size(); ++i)
    {
        if(cur < inter[i].st) ans += 2LL * (ll)(inter[i].st - cur);
        cur = max(cur, inter[i].nd);
    }
    return ans;
}
#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...