Submission #640380

#TimeUsernameProblemLanguageResultExecution timeMemory
640380piOOESorting (IOI15_sorting)C++17
100 / 100
438 ms15080 KiB
#include <bits/stdc++.h>
#include "sorting.h"

using namespace std;

vector<int> inv(vector<int> p) {
    vector<int> inv(p.size());
    for (int i = 0; i < p.size(); ++i) {
        inv[p[i]] = i;
    }
    return inv;
}

int findSwapPairs(int n, int p_[], int M, int X[], int Y[], int P[], int Q[]) {
    auto solve = [&](int m) {
        auto calc = [&](vector<int> p) {
            for (int i = 0; i < m; ++i) {
                swap(p[X[i]], p[Y[i]]);
            }
            return p;
        };
        vector<int> p(p_, p_ + n);
        vector<int> e = calc(p);
        vector<int> rev = inv(p), rev_e = inv(e);
        auto doSwap = [&](int i, int j, bool wtf = true) {
            int x = p[i], y = p[j];
            swap(p[i], p[j]);
            rev[y] = i, rev[x] = j;
            if (wtf) {
                int px = rev_e[x], py = rev_e[y];
                swap(e[px], e[py]);
                rev_e[e[px]] = px, rev_e[e[py]] = py;
            }
        };
        int i = 0;
        for (int r = 0; r < m; ++r){
            doSwap(X[r], Y[r], 0);
            P[r] = 0, Q[r] = 0;
            for (; i < n; ++i) {
                if (e[i] != i) {
                    P[r] = rev[i];
                    Q[r] = rev[e[i]];
                    break;
                }
            }
            doSwap(P[r], Q[r]);
        }
        return is_sorted(p.begin(), p.end());
    };
    int low = -1, high = M;
    while (low + 1 < high) {
        int m = (low + high) >> 1;
        if (solve(m)) {
            high = m;
        } else {
            low = m;
        }
    }
    solve(high);
    return high;
}

Compilation message (stderr)

sorting.cpp: In function 'std::vector<int> inv(std::vector<int>)':
sorting.cpp:8:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    8 |     for (int i = 0; i < p.size(); ++i) {
      |                     ~~^~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...