Submission #1278696

#TimeUsernameProblemLanguageResultExecution timeMemory
1278696MMihalevAncient Books (IOI17_books)C++20
50 / 100
98 ms27992 KiB
#include<iostream>
#include<vector>
#include "books.h"
using namespace std;
const int MAX_N=1e6+6;
int col[MAX_N];
int cols;
int a[MAX_N];
int l[MAX_N];
int r[MAX_N];
int n;
long long ans;
long long minimum_walk(std::vector<int> p, int s)
{
    n=p.size();
    s++;
    for(int i=1;i<=n;i++)
    {
        l[i]=1e9;
        r[i]=-1;
        a[i]=p[i-1]+1;
    }
    ///init stuff

    for(int i=1;i<=n;i++)
    {
        ans+=abs(i-a[i]);
        if(col[i]==0)
        {
            if(i!=s && i==a[i])continue;
            cols++;
            int pos=i;
            while(col[pos]==0)
            {
                l[cols]=min(l[cols],pos);
                r[cols]=max(r[cols],pos);
                col[pos]=cols;
                pos=a[pos];
            }
        }
    }

    vector<int>sep;
    bool has=0;
    int active=0;
    int e=n;
    while(col[e]==0)e--;
    for(int i=1;i<=e;i++)
    {
        if(has && active==0)
        {
            sep.push_back(i-1);
        }

        int curcol=col[i];
        if(l[curcol]==i)
        {
            has=1;
            active++;
        }
        if(r[curcol]==i)active--;
    }
    if(sep.size()==0)return ans*s;
    
    ///cycle stuff


    for(int i=sep.size()-1;i>=0;i--)
    {
        if(sep[i]>=s)ans+=2;
    }
    ///right part


    for(int i=0;i<sep.size();i++)
    {
        if(sep[i]<s)ans+=2;
    }
    ///left part


	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...