답안 #758725

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
758725 2023-06-15T08:09:43 Z boris_mihov 고대 책들 (IOI17_books) C++17
0 / 100
1 ms 212 KB
#include "books.h"
#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>

typedef long long llong;
const int MAXN = 100000 + 10;
const int INF  = 1e9;

int n, s;
int p[MAXN];
int pointingTo[MAXN];
llong ans;

bool notSorted()
{
    for (int i = 1 ; i < n ; ++i)
    {
        if (p[i] > p[i + 1])
        {
            return true;
        }
    }

    return false;
}

llong minimum_walk(std::vector <int> P, int S) 
{
    n = P.size(); s = S + 1;
    for (int i = 1 ; i <= n ; ++i)
    {
        p[i] = P[i - 1] + 1;
    }

    int pos = s;
    int holding = -1;
    bool start = false;
    int l = 1, r = n;

    while (true)
    {
        while (l <= r && p[l] == l)
        {
            l++;
        }

        while (l <= r && p[r] == r)
        {
            r--;
        }

        if (l > r)
        {
            break;
        }

        for (int i = 1 ; i <= n ; ++i)
        {
            pointingTo[p[i]] = i;
        }

        if (!start)
        {
            while (pos <= r)
            {
                if (pos == holding)
                {
                    std::swap(p[pos], holding);
                    if (holding == -1 || holding < pos)
                    {
                        break;
                    }
                }

                if (p[pos] > pos && (holding == -1 || p[pos] < holding))
                {
                    std::swap(holding, p[pos]);
                }

                pos++;
                ans++;
            }

            if (pos > r)
            {
                pos--;
                ans--;
            }
        } else
        {
            while (pos >= l)
            {
                if (pos == holding)
                {
                    std::swap(p[pos], holding);
                    if (holding == -1 || holding > pos)
                    {
                        break;
                    }
                }

                if (p[pos] < pos && (holding == -1 || p[pos] > holding))
                {
                    std::swap(holding, p[pos]);
                }

                pos--;
                ans++;
            }

            if (pos < l)
            {
                pos++;
                ans--;
            }
        }

        start ^= 1;
    }

    ans += abs(pos - s);
	return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Incorrect 0 ms 212 KB 3rd lines differ - on the 1st token, expected: '8', found: '10'
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Incorrect 0 ms 212 KB 3rd lines differ - on the 1st token, expected: '8', found: '10'
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Incorrect 0 ms 212 KB 3rd lines differ - on the 1st token, expected: '8', found: '10'
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 212 KB 3rd lines differ - on the 1st token, expected: '3304', found: '3888'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Incorrect 0 ms 212 KB 3rd lines differ - on the 1st token, expected: '8', found: '10'
4 Halted 0 ms 0 KB -