Submission #1061903

#TimeUsernameProblemLanguageResultExecution timeMemory
1061903_8_8_Ancient Books (IOI17_books)C++17
100 / 100
112 ms14968 KiB
    #include "books.h"
    #include <bits/stdc++.h>
        
    using namespace std;
    typedef long long ll;
    const int N = 1e6 + 12;
    int n;
     
    long long minimum_walk(vector<int> p, int s) {
        n = (int)p.size();
        int it = 0;
        ll res = 0;
        for(int i = 0;i < n;i++) {
            res += abs(i - p[i]);
        }
        if(s == 0) {
            int nn = -1;
            for(int i = n - 1;i >= 0;i--) {
                if(p[i] != i) {
                    nn = i;
                    break;
                }
            }
            int mx = -1;
            for(int i = 0;i < nn;i++) {
                mx = max(mx,p[i]);
                if(mx == i) {
                    res += 2;
                }
            }
            return res;
        }
        int l = s,r = s,R = s,L = s;
        int tl,tr;
        for(int i = 0;i < n;i++) {
            if(p[i] != i) {
                tl = i;
                break;
            }
        }
        for(int i = n - 1;i >= 0;i--) {
            if(i != p[i]) {
                tr = i;
                break;
            }
        }
        if(!res) {
            return res;
        }
        while(true) {
            R = max({R,p[r],p[l]});
            L = min({L,p[l],p[r]});
            if(l <= tl && r >= tr) {
                break;
            }
            if(r < R) {
                assert(R <= tr);
                r++;
            } else if(L < l) {
                assert(L >= tl);
                l--;
            } else {
                int l_ = -1e9,r_ = (int)1e9;
                for(int i = l - 1;i >= tl;i--) {
                    if(p[i] > r) {
                        l_ = i;
                        break;
                    }
                }
                for(int i = r + 1;i <= tr;i++) {
                    if(p[i] < l) {
                        r_ = i;
                        break;
                    }
                }
                if(l_ == (int)-1e9) {
                    assert(r_ == (int)1e9);
                    if(l > tl) {
                        res += 2;
                        l--;
                        int mn = (int)1e9;
                        for(int j = l;j > tl;--j) {
                            assert(p[j] <= l && p[j] >= tl);
                            mn = min(mn,p[j]);
                            if(j == mn) {
                                res += 2;
                            }
                        }
                    }
                    if(r < tr) {
                        res += 2;
                        r++;
                        int mx = -1;
                        for(int j = r;j < tr;j++) {
                            assert(p[j] >= r && p[j] <= tr);
                            mx = max(mx,p[j]);
                            if(mx == j) {
                                res += 2;
                            }
                        }
                    }
                    return res;
                } else {
                    ll a = 2,b = 2;
                    int mn = (int)1e9;
                    for(int j = l - 1;j > l_;j--) {
                        mn = min(mn,p[j]);
                        if(mn == j) {
                            a += 2;
                        }
                    }
                    int mx= -1;
                    for(int j = r + 1;j < r_;j++) {
                        mx = max(mx,p[j]);
                        if(mx == j) b += 2;
                    }
                    if(a < b) {
                        res += a;
                        for(int j = l - 1;j > l_;j--) {
                            L = min(L,p[j]);
                            R = max(R,p[j]);
                        }
                        l = l_;
                    } else {
                        res += b;
                        for(int j = r + 1;j < r_;j++) {
                            L = min(L,p[j]);
                            R = max(R,p[j]);
                        }
                        r = r_;
                    }
                }
            }
        }
        return res;
    }

Compilation message (stderr)

books.cpp: In function 'long long int minimum_walk(std::vector<int>, int)':
books.cpp:11:13: warning: unused variable 'it' [-Wunused-variable]
   11 |         int it = 0;
      |             ^~
#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...