제출 #423685

#제출 시각아이디문제언어결과실행 시간메모리
423685arayi고대 책들 (IOI17_books)C++17
50 / 100
255 ms39788 KiB
#include "books.h"
#include <bits/stdc++.h>
#define lli long long
#define ad push_back
#define fr first
#define sc second
#define MP make_pair
using namespace std;

const int N = 1e6 + 30;

int i1 = 1, ii, n;
int col[N], a[N], cl[N];
int mn[N], mx[N], m[N], x[N];
lli ans;
int dfs(int v)
{
    col[v] = i1;
    cl[v] = ii;
    mn[ii] = min(mn[ii], v), m[i1] = min(m[i1], v);
    mx[ii] = max(mx[ii], v), x[i1] = max(x[i1], v);
    if(!col[a[v]]) return max(v, dfs(a[v]));
    return v;
}
long long minimum_walk(vector<int> p, int s)
{
	n = p.size();
	for(int i = 0; i < n; i++) a[i] = p[i], ans += abs(a[i] - i), mn[i] = m[i] = n;
	int nx = -1;
	for(int i = 0; i < n; i++)
    {
        if(a[i] == i) continue;
        if(!col[i])
        {
            if(nx >= 0 && i > nx) ans += 2*(i - nx), i1++;
            ii++;
            nx = max(nx, dfs(i));
        }
    }
    int dz = -1, aj = -1;
    for(int i = s; i < n; i++)
    {
        if(col[i])
        {
            aj = i;
            break;
        }
    }
    for(int i = s; i >= 0; i--)
    {
        if(col[i])
        {
            dz = i;
            break;
        }
    }
    if(dz == -1 && aj == -1) return ans;
    else if(dz == -1) ans += 2*abs(aj - s);
    else if(aj == -1) ans += 2*abs(s - dz);
    else if(col[aj] == col[dz])
    {
        int sm = 0;
        int i = s, nx = s;
        while(nx < x[col[aj]])
        {
            if(cl[i]) nx = max(nx, mx[cl[i]]);
            i++;
            if(i > nx) sm++, nx = i;
        }
        int ss = 0;
        i = s, nx = s;
        while(nx > m[col[aj]])
        {
            if(cl[i]) nx = min(nx, mn[cl[i]]);
            i--;
            if(i < nx) ss++, nx = i;
        }
        ans += 2*min(ss, sm);
        //cout << s <<  " " << sm << endl;
    }
    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...