Submission #917954

#TimeUsernameProblemLanguageResultExecution timeMemory
917954nightfal고대 책들 (IOI17_books)C++14
100 / 100
102 ms20048 KiB
#include <cstdio>
#include <vector>
#include <cassert>
#include <cstdlib>
#include <tuple>
#include <climits>

using namespace std;

bool isSubtask3(int s) {return s==0;}
bool isSubtask4(int n) {return n<=1000;}

pair<int,int> extend(int l, int r, vector<int>& lmost, vector<int>& rmost) {
    while(l > min(lmost[l],lmost[r]) || r < max(rmost[l],rmost[r])) {
        l=min(l,min(lmost[l],lmost[r])); 
        r=max(r,max(rmost[r],rmost[l]));
    }
    return make_pair(l,r);
} 

long long fulltask(vector<int> p, int s) {

    int n = p.size();

    int start; for(start = 0; start < s; start++) if(start!=p[start]) break;
    int end; for(end = n-1; end > s; end--) if(end!=p[end]) break;

    long long distBooks=0;
    for(int i=start; i<=end; i++) distBooks += abs(p[i]-i);

    int l = min(s,p[s]), r=max(s,p[s]); 
    vector<int> lmost(n), rmost(n); lmost[s] = min(s,p[s]); rmost[s] = max(s,p[s]);
    for(int i=s-1; i>=start; i--) {lmost[i] = min(lmost[i+1],p[i]); rmost[i] = max(rmost[i+1],p[i]);}
    for(int i=s+1; i<=end ; i++)  {lmost[i] = min(lmost[i-1],p[i]); rmost[i] = max(rmost[i-1],p[i]);}
    tie(l,r) = extend(l,r,lmost,rmost);

    long long distFree=0, rMoves=0, lMoves=0;

    while(start<l || r<end) {
        int l2, r2;
        if(r<end && (l<=start || rMoves < lMoves)) {
            r++; rMoves++;
            tie(l2,r2) = extend(l,r,lmost,rmost);
            if (l2<l) {distFree += rMoves; rMoves = lMoves = 0;}
        }
        else {
            l--; lMoves++;
            tie(l2,r2) = extend(l,r,lmost,rmost);
            if (r<r2) {distFree += lMoves; rMoves = lMoves = 0;}
        }
        l = l2; r = r2;
    }
    distFree += rMoves + lMoves;
    // printf("totalMoves=%d, jumps=%d\n",totalMoves,jumps);
    return distFree*2+distBooks;
}

long long minimum_walk(std::vector<int> p, int s) {
    // if (isSubtask3(s)) return subtask3(p);
    // if (isSubtask4(s)) return subtask4(p,s);
    return fulltask(p,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...