Submission #1355551

#TimeUsernameProblemLanguageResultExecution timeMemory
1355551toast12Sorting (IOI15_sorting)C++20
74 / 100
1094 ms7340 KiB
#include "sorting.h"
#include <bits/stdc++.h>
using namespace std;

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
    int lo = 0, hi = M;
    int temp[N];
    for (int i = 0; i < N; i++) temp[i] = S[i];
    while (lo < hi) {
        int mid = (lo+hi)/2;
        int ans = mid;
        vector<int> pos(N);
        for (int i = 0; i < N; i++) pos[S[i]] = i;
        for (int i = 0; i < mid; i++) {
            ans = i;
            if (is_sorted(S, S+N)) break;
            swap(pos[S[X[i]]], pos[S[Y[i]]]);
            swap(S[X[i]], S[Y[i]]);
            if (is_sorted(S, S+N)) {
                ans = i+1;
                break;
            }
            vector<int> v(N);
            for (int j = 0; j < N; j++) v[j] = S[j];
            for (int j = i+1; j < mid; j++) swap(v[X[j]], v[Y[j]]);
            for (int j = 0; j < N; j++) {
                if (v[j] != j) {
                    int x = pos[j];
                    int y = pos[v[j]];
                    swap(pos[S[x]], pos[S[y]]);
                    swap(S[x], S[y]);
                    break;
                }
            }
        }
        if (is_sorted(S, S+N)) hi = mid;
        else lo = mid+1;
        for (int i = 0; i < N; i++) S[i] = temp[i];
    }
    vector<int> pos(N);
    for (int i = 0; i < N; i++) pos[S[i]] = i;
    for (int i = 0; i < hi; i++) {
        if (is_sorted(S, S+N)) break;
        swap(pos[S[X[i]]], pos[S[Y[i]]]);
        swap(S[X[i]], S[Y[i]]);
        if (is_sorted(S, S+N)) break;
        vector<int> v(N);
        for (int j = 0; j < N; j++) v[j] = S[j];
        for (int j = i+1; j < hi; j++) swap(v[X[j]], v[Y[j]]);
        for (int j = 0; j < N; j++) {
            if (v[j] != j) {
                int x = pos[j];
                int y = pos[v[j]];
                swap(pos[S[x]], pos[S[y]]);
                swap(S[x], S[y]);
                P[i] = x, Q[i] = y;
                break;
            }
        }
    }
	return hi;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...