답안 #65235

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
65235 2018-08-07T06:07:51 Z Kubalionzzale 정렬하기 (IOI15_sorting) C++14
74 / 100
1000 ms 6648 KB
#include "sorting.h"

#include <iostream>
#include <algorithm>

std::pair<int, int> valuesSorting[600010];
int b[200010];
int curPlace[200010];

bool check(int n, int a[], int cur, int x[], int y[])
{
    bool flag = false;
    for (int i = 0; i < n; ++i)
    {
        a[i] = b[i];

        if (a[i] != i)
            flag = true;
    }

    if (!flag)
        return 0;

    for (int i = 0; i <= cur; ++i)
    {
        std::swap(a[x[i]], a[y[i]]);
    }

    int cnt = 0;
    for (int i = 0; i < n; ++i)
    {
        while (a[i] != i)
        {
            int who = a[i];
            std::swap(a[i], a[who]);

            ++cnt;
        }
    }

    if (cnt - 1 > cur)
        return 0;
    else
        return 1;
}

int findSwapPairs(int n, int a[], int m, int x[], int y[], int xans[], int yans[]) {

    for (int i = 0; i < n; ++i)
    {
  //      std::cout << a[i] << " ";
        curPlace[a[i]] = i;
        b[i] = a[i];
    }

//    std::cout << "\n";

    int lowest = -1;
    for (int i = 0; i < m; ++i)
    {
        if (check(n, a, i, x, y))
        {
            lowest = i;
            break;
        }
    }



/*
    int lowest = m;
    int l = 0, r = m - 1;
    while (l <= r)
    {
        int mid = l + (r - l) / 2;

        if (check(n, a, mid, x, y))
        {
            lowest = std::min(lowest, mid);

            r = mid - 1;
        }
        else
        {
            l = mid + 1;
        }
    }*/

    for (int i = 0; i < n; ++i)
    {
        a[i] = b[i];
    }

    for (int i = 0; i <= lowest; ++i)
    {
        std::swap(a[x[i]], a[y[i]]);
    }

    int cnt = 0;
    for (int i = 0; i < n; ++i)
    {
        while (a[i] != i)
        {
            valuesSorting[cnt].first = a[i];
            valuesSorting[cnt].second = a[a[i]];

            int who = a[i];
            std::swap(a[i], a[who]);

            ++cnt;
        }
    }

    for (int i = 0; i < n; ++i)
    {
        a[i] = b[i];
    }

    for (int i = 0; i <= lowest; ++i)
    {
        if (x[i] != y[i])
        {
            int val1 = a[x[i]], val2 = a[y[i]];
            std::swap(a[x[i]], a[y[i]]);

            curPlace[val1] = y[i];
            curPlace[val2] = x[i];
        }
/*
        for (int i = 0; i < n; ++i)
        {
            std::cout << curPlace[i] << " ";
        }
        std::cout << "\n";*/

        if (i >= cnt)
        {
            xans[i] = 0;
            yans[i] = 0;
        }
        else
        {
            int one = valuesSorting[i].first;
            int two = valuesSorting[i].second;
            int curOne = curPlace[one];
            int curTwo = curPlace[two];

            std::swap(a[curOne], a[curTwo]);

            xans[i] = curOne;
            yans[i] = curTwo;
            curPlace[one] = curTwo;
            curPlace[two] = curOne;
        }
/*
        for (int i = 0; i < n; ++i)
        {
            std::cout << curPlace[i] << " ";
        }
        std::cout << "\n";*/
    }

/*
    std::cout << lowest + 1 << "\n";
    for (int i = 0; i <= lowest; ++i)
    {
        std::cout << x[i] << " " << y[i] << "|\n";
        std::cout << xans[i] << " " << yans[i] << "\n";
    }
*/
    return lowest + 1;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 3 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 2 ms 384 KB Output is correct
6 Correct 2 ms 384 KB Output is correct
7 Correct 3 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 3 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 2 ms 384 KB Output is correct
6 Correct 2 ms 384 KB Output is correct
7 Correct 3 ms 384 KB Output is correct
8 Correct 2 ms 384 KB Output is correct
9 Correct 2 ms 256 KB Output is correct
10 Correct 3 ms 384 KB Output is correct
11 Correct 3 ms 384 KB Output is correct
12 Correct 2 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 256 KB Output is correct
2 Correct 3 ms 384 KB Output is correct
3 Correct 2 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 2 ms 384 KB Output is correct
6 Correct 2 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 3 ms 384 KB Output is correct
4 Correct 2 ms 384 KB Output is correct
5 Correct 2 ms 384 KB Output is correct
6 Correct 2 ms 384 KB Output is correct
7 Correct 3 ms 384 KB Output is correct
8 Correct 2 ms 384 KB Output is correct
9 Correct 2 ms 256 KB Output is correct
10 Correct 3 ms 384 KB Output is correct
11 Correct 3 ms 384 KB Output is correct
12 Correct 2 ms 384 KB Output is correct
13 Correct 2 ms 256 KB Output is correct
14 Correct 3 ms 384 KB Output is correct
15 Correct 2 ms 384 KB Output is correct
16 Correct 2 ms 384 KB Output is correct
17 Correct 2 ms 384 KB Output is correct
18 Correct 2 ms 384 KB Output is correct
19 Correct 2 ms 256 KB Output is correct
20 Correct 3 ms 256 KB Output is correct
21 Correct 5 ms 512 KB Output is correct
22 Correct 6 ms 512 KB Output is correct
23 Correct 5 ms 512 KB Output is correct
24 Correct 5 ms 512 KB Output is correct
25 Correct 3 ms 512 KB Output is correct
26 Correct 3 ms 512 KB Output is correct
27 Correct 4 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 436 KB Output is correct
2 Correct 29 ms 504 KB Output is correct
3 Correct 26 ms 384 KB Output is correct
4 Correct 12 ms 384 KB Output is correct
5 Correct 4 ms 384 KB Output is correct
6 Correct 4 ms 384 KB Output is correct
7 Correct 9 ms 384 KB Output is correct
8 Correct 27 ms 484 KB Output is correct
9 Correct 27 ms 384 KB Output is correct
10 Correct 29 ms 444 KB Output is correct
11 Correct 23 ms 484 KB Output is correct
12 Correct 9 ms 512 KB Output is correct
13 Correct 19 ms 484 KB Output is correct
14 Correct 3 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 436 KB Output is correct
2 Correct 29 ms 504 KB Output is correct
3 Correct 26 ms 384 KB Output is correct
4 Correct 12 ms 384 KB Output is correct
5 Correct 4 ms 384 KB Output is correct
6 Correct 4 ms 384 KB Output is correct
7 Correct 9 ms 384 KB Output is correct
8 Correct 27 ms 484 KB Output is correct
9 Correct 27 ms 384 KB Output is correct
10 Correct 29 ms 444 KB Output is correct
11 Correct 23 ms 484 KB Output is correct
12 Correct 9 ms 512 KB Output is correct
13 Correct 19 ms 484 KB Output is correct
14 Correct 3 ms 384 KB Output is correct
15 Execution timed out 1062 ms 6648 KB Time limit exceeded
16 Halted 0 ms 0 KB -