Submission #1155851

#TimeUsernameProblemLanguageResultExecution timeMemory
1155851alexddAncient Books (IOI17_books)C++20
50 / 100
82 ms19960 KiB
#include "books.h"
#include<bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int n;
int p[1000005];
int maxpref[1000005],minsuff[1000005];
long long minimum_walk(std::vector<int> cit_p, int s)
{
    s++;
    n = cit_p.size();
    for(int i=1;i<=n;i++)
        p[i] = cit_p[i-1]+1;

    int ult=0,primu=n+1;
    long long rez=0;
    for(int i=1;i<=n;i++)
    {
        maxpref[i] = max(maxpref[i-1], p[i]);
        if(p[i]!=i)
        {
            ult=i;
            primu = min(primu, i);
        }
        rez += abs(p[i]-i);
    }
    minsuff[n+1] = n+1;
    for(int i=n;i>0;i--)
        minsuff[i] = min(minsuff[i+1], p[i]);

    if(ult==0)
        return 0;

    ult = max(ult, s);
    primu = min(primu, s);

    for(int i=primu+1;i<=ult;i++)
        if(maxpref[i-1]<i && minsuff[i]>=i)
            rez+=2;

    /*for(int i=primu+1;i<=s;i++)
    {
        bool gasit=0;
        for(int j=1;j<i;j++)
            if(i<=p[j] && p[j]<=s)
                gasit=1;
        for(int j=i;j<=s;j++)
            if(p[j]<i)
                gasit=1;
        if(!gasit)
            rez+=2;
    }
    for(int i=s+1;i<=ult;i++)
    {
        bool gasit=0;
        for(int j=i;j<=n;j++)
            if(s<=p[j] && p[j]<i)
                gasit=1;
        for(int j=s;j<i;j++)
            if(p[j]>=i)
                gasit=1;
        if(!gasit)
            rez+=2;
    }*/

    rez += min(ult-s, s-primu);

    return rez;
}
#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...