Submission #299342

# Submission time Handle Problem Language Result Execution time Memory
299342 2020-09-14T18:01:57 Z Hideo Sorting (IOI15_sorting) C++17
74 / 100
255 ms 20268 KB
#include "sorting.h"
//#include "grader.cpp"
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define all(s) s.begin(), s.end()
#define pb push_back
#define fr first
#define sc second
#define vi vector < int >
#define pi pair < int, int >

const int MN = 3e5 + 7;

vector < pi > sw, out;
int a[MN], b[MN], r[MN];
int x[MN], y[MN];
int n, m;

bool check (int k){
    for (int i = 0; i < n; i++)
        a[i] = b[i];
    for (int i = 0; i < k; i++)
        swap(a[x[i]], a[y[i]]);
    queue < pi > q;
    for (int i = 0; i < n; i++)
        r[a[i]] = i;
    for (int i = 0; i < n; i++)
        if (a[a[i]] == i)
            q.push({i, a[i]});
    int l = 0, cnt = 0;
    vector < pi > kek;
    while (l < n){
        while (!q.empty()){
            int v = q.front().fr, u = q.front().sc;
            q.pop();
            if (r[v] == v)
                continue;

            kek.pb({v, u});
            swap(a[v], a[u]);
            swap(r[a[v]], r[a[u]]);
            cnt++;
        }
        if (r[l] != l){
            int v = l, u = r[l];
            kek.pb({v, a[v]});
            swap(a[v], a[u]);
            swap(r[a[v]], r[a[u]]);
            if (a[a[u]] == u)
                q.push({u, a[u]});
            cnt++;
        }
        l++;
    }
    if (cnt <= k)
        sw = kek;
    return cnt <= k;
}

void simulate (int k){
    while (sw.size() != k)
        sw.pb({0, 0});
    for (int i = 0; i < n; i++){
        a[i] = b[i];
        r[a[i]] = i;
    }
    for (int i = 0; i < k; i++){
        swap(a[x[i]], a[y[i]]);
        swap(r[a[x[i]]], r[a[y[i]]]);
        int v = r[sw[i].fr], u = r[sw[i].sc];
        out.pb({v, u});
        swap(a[v], a[u]);
        swap(r[a[v]], r[a[u]]);
    }
}

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
    n = N; m = M;
    bool sorted = true;
    for (int i = 0; i < n; i++){
        b[i] = S[i];
        if (b[i] != i)
            sorted = false;
    }
    if (sorted)
        return 0;
    for (int i = 0; i < m; i++){
        x[i] = X[i];
        y[i] = Y[i];
    }
    int lf = 0, rg = M;
    while (lf + 1 < rg){
        int mid = (lf + rg) >> 1;
        if (check(mid))
            rg = mid;
        else
            lf = mid;
    }
    for (int i = max(1, rg - 10); i < rg; i++){
        if (check(i))
            rg = i;
    }
    simulate(rg);
    for (int i = 0; i < out.size(); i++){
        P[i] = out[i].fr;
        Q[i] = out[i].sc;
    }
    return rg;
}

Compilation message

sorting.cpp: In function 'void simulate(int)':
sorting.cpp:64:22: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   64 |     while (sw.size() != k)
      |            ~~~~~~~~~~^~~~
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:107:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  107 |     for (int i = 0; i < out.size(); i++){
      |                     ~~^~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 1 ms 384 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 1 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 1 ms 384 KB Output is correct
10 Correct 1 ms 512 KB Output is correct
11 Correct 1 ms 384 KB Output is correct
12 Correct 1 ms 416 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 288 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 0 ms 384 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 1 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 1 ms 384 KB Output is correct
10 Correct 1 ms 512 KB Output is correct
11 Correct 1 ms 384 KB Output is correct
12 Correct 1 ms 416 KB Output is correct
13 Correct 0 ms 288 KB Output is correct
14 Correct 1 ms 384 KB Output is correct
15 Correct 1 ms 384 KB Output is correct
16 Correct 1 ms 384 KB Output is correct
17 Correct 1 ms 384 KB Output is correct
18 Correct 0 ms 384 KB Output is correct
19 Correct 0 ms 256 KB Output is correct
20 Correct 1 ms 384 KB Output is correct
21 Correct 2 ms 640 KB Output is correct
22 Correct 2 ms 640 KB Output is correct
23 Correct 2 ms 640 KB Output is correct
24 Correct 2 ms 640 KB Output is correct
25 Correct 2 ms 640 KB Output is correct
26 Correct 2 ms 640 KB Output is correct
27 Correct 2 ms 672 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 512 KB Output is correct
2 Correct 2 ms 512 KB Output is correct
3 Correct 2 ms 512 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 2 ms 512 KB Output is correct
6 Correct 2 ms 512 KB Output is correct
7 Correct 3 ms 512 KB Output is correct
8 Correct 2 ms 512 KB Output is correct
9 Correct 2 ms 512 KB Output is correct
10 Correct 2 ms 640 KB Output is correct
11 Correct 2 ms 640 KB Output is correct
12 Correct 3 ms 512 KB Output is correct
13 Correct 3 ms 640 KB Output is correct
14 Correct 1 ms 512 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 512 KB Output is correct
2 Correct 2 ms 512 KB Output is correct
3 Correct 2 ms 512 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 2 ms 512 KB Output is correct
6 Correct 2 ms 512 KB Output is correct
7 Correct 3 ms 512 KB Output is correct
8 Correct 2 ms 512 KB Output is correct
9 Correct 2 ms 512 KB Output is correct
10 Correct 2 ms 640 KB Output is correct
11 Correct 2 ms 640 KB Output is correct
12 Correct 3 ms 512 KB Output is correct
13 Correct 3 ms 640 KB Output is correct
14 Correct 1 ms 512 KB Output is correct
15 Incorrect 255 ms 20268 KB Output isn't correct
16 Halted 0 ms 0 KB -