Submission #1182370

#TimeUsernameProblemLanguageResultExecution timeMemory
1182370rorroSorting (IOI15_sorting)C++20
100 / 100
186 ms13952 KiB
#define debug 0

#include "sorting.h"
#include <bits/stdc++.h>

//int N, *S, M, *X, *Y, *P, *Q;
int n;
int *A, *D, *ID, *IA; //actual, dest, in d, in a

void print_state() {
        if (!debug)
                return;
        std::cerr << "D[i]:\n";
        for (int i = 0; i < n; ++i) std::cerr << D[i] << ' ';
        std::cerr << "\nID:\n";
        for (int i = 0; i < n; ++i) std::cerr << ID[i] << ' ';
        std::cerr << "\nA:\n";
        for (int i = 0; i < n; ++i) std::cerr << A[i] << ' ';
        std::cerr << "\nIA:\n";
        for (int i = 0; i < n; ++i) std::cerr << IA[i] << ' ';
        std::cerr << '\n';
}

inline bool check(int mid, int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
        if (debug) std::cerr << "entering check function\n\n\n\n\n\n\n";

        if (D == NULL)
                D  = (int*)(malloc(sizeof(int) * N));
        if (A == NULL)
                A  = (int*)(malloc(sizeof(int) * N));
        if (ID == NULL)
                ID = (int*)(malloc(sizeof(int) * N));
        if (IA == NULL)
                IA = (int*)(malloc(sizeof(int) * N));

        for (int i = 0; i < N; ++i) {
                A[i] = S[i];
                D[i] = i;
        }
        for (int i = mid-1; i >= 0; --i)
                std::swap(D[X[i]], D[Y[i]]);

        for (int i = 0; i < N; ++i) {
                ID[D[i]] = i;
                IA[A[i]] = i;
        }

        if (debug) {
                std::cerr << "this is the initial state of the simulation, mid " << mid << " ";
                print_state();
        }

        int j = 0;

        for (int i = 0; i < mid; ++i) {
                if (debug)
                        std::cerr << "forced swap: " << X[i] << ' ' << Y[i] << '\n';
                std::swap( A[X[i]],  A[Y[i]]);
                std::swap(IA[A[X[i]]], IA[A[Y[i]]]);
                std::swap( D[X[i]],  D[Y[i]]);
                std::swap(ID[D[X[i]]], ID[D[Y[i]]]);
                if (debug) {
                        std::cerr << "this is the state after forced swap:\n";
                        print_state();
                }

                bool f = false;

                while (j < N) {
                        int k = IA[j++];
                        if (A[k] != D[k]) {
                                if (debug) std::cerr << "swapping " << k << ' ' << ID[A[k]] << '\n';
                                P[i] = k;
                                Q[i] = ID[A[k]];
                                std::swap(IA[A[P[i]]], IA[A[Q[i]]]);
                                std::swap( A[P[i]],  A[Q[i]]);
                                //std::swap(IA[A[k]], IA[A[ID[A[k]]]]);
                                f = true;
                                break;
                        }

                }

                if (f == false) {
                        if (debug)
                                std::cerr << "no swap\n";
                        P[i] = Q[i] = 0;
                }
                if (debug) {
                        std::cerr << "this is the state after my swap:\n";
                        print_state();
                }
        }

        for (int i = 0; i < N; ++i)
                if (A[i] != i)
                        return false;
        return true;
}

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
        n = N;
        int lo = 0, hi = M;
        while (lo < hi) {
                int mid = (lo+hi)/2;
                if (check(mid, N, S, M, X, Y, P, Q))
                        hi = mid;
                else
                        lo = mid+1;
        }
        check(lo, N, S, M, X, Y, P, Q);
        return lo;
}
#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...