제출 #366053

#제출 시각아이디문제언어결과실행 시간메모리
366053denkendoemeer고대 책들 (IOI17_books)C++14
100 / 100
187 ms19052 KiB
#include<bits/stdc++.h>
#include "books.h"
#define ll long long
using namespace std;
ll minimum_walk(vector<int>p,int s)
{
    int n=p.size(),i;
    ll ans=0;
    for(i=0;i<n;i++)
        ans=ans+abs(i-p[i]);
    int minl=n-1,minr=0;
    for(i=0;i<n;i++)
        if (i!=p[i])
            minl=min(minl,i),minr=max(minr,i);
    int nrl=s,nrr=s;
    queue<int>qu;
    qu.push(s);
    while(1){
        while(qu.size()){
            int nod=qu.front();
            qu.pop();
            while(nrl>p[nod]){
                nrl--;
                qu.push(nrl);
            }
            while(nrr<p[nod]){
                nrr++;
                qu.push(nrr);
            }
        }
        int st=nrl,dr=nrr;
        int cntl=0,cntr=0,okl=0,okr=0;
        queue<int>ql,qr;
        while(1){
            if (st<=minl)
                break;
            st--;
            cntl++;
            ql.push(st);
            while(ql.size()){
                int nod=ql.front();
                ql.pop();
                while(st>p[nod]){
                    st--;
                    ql.push(st);
                }
                if (p[nod]>s)
                    okl=1;
            }
            if (okl)
                break;
        }
        while(1){
            if (dr>=minr)
                break;
            dr++;
            cntr++;
            qr.push(dr);
            while(qr.size()){
                int nod=qr.front();
                qr.pop();
                while(dr<p[nod]){
                    dr++;
                    qr.push(dr);
                }
                if (p[nod]<s)
                    okr=1;
            }
            if (okr)
                break;
        }
        if (okl && okr){
            ans=ans+2*min(cntl,cntr);
            while(nrl>st)
                qu.push(--nrl);
            while(nrr<dr)
                qu.push(++nrr);
        }
        else{
            ans=ans+2*(cntl+cntr);
            break;
        }
    }
    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...