Submission #1199523

#TimeUsernameProblemLanguageResultExecution timeMemory
1199523AvianshAncient Books (IOI17_books)C++20
50 / 100
112 ms19784 KiB
#include "books.h"
#include <bits/stdc++.h>

using namespace std;

struct dsu{
    vector<int>root;
    vector<int>siz;
    vector<int>maxima;
    dsu(int n){
        maxima=vector<int>(n);
        iota(maxima.begin(),maxima.end(),0);
        root=vector<int>(n);
        iota(root.begin(),root.end(),0);
        siz=vector<int>(n,1);
    }
    bool unite(int x, int y){
        x=findRoot(x);
        y=findRoot(y);
        if(x==y)
            return 0;
        if(siz[x]<siz[y]){
            swap(x,y);
        }
        siz[x]+=siz[y];
        root[y]=x;
        maxima[x]=max(maxima[x],maxima[y]);
        return 1;
    }
    int findRoot(int x){
        if(x==root[x])
            return x;
        return root[x]=findRoot(root[x]);
    }
};

long long minimum_walk(vector<int> p, int s) {
    long long ans = 0;
    int n = p.size();
    dsu ds(n);
    for(int i = 0;i<n;i++){
        ans+=abs(i-p[i]);
        ds.unite(i,p[i]);
    }
    assert(s==0);
    int mxreach = ds.maxima[0];
    for(int i = 0;i<n;i++){
        if(i!=p[i]){
            if(mxreach<i){
                ans+=2*(i-mxreach);
            }
            mxreach=max(mxreach,ds.maxima[ds.findRoot(i)]);
            ds.unite(0,i);
        }
    }
	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...