Submission #1240178

#TimeUsernameProblemLanguageResultExecution timeMemory
1240178simplemind_31Sorting (IOI15_sorting)C++20
20 / 100
1 ms580 KiB
#include "sorting.h"
#include <bits/stdc++.h>
using namespace std;

#define PII pair<int, int>
#define MP make_pair
#define FI first
#define SE second

int sizeN;
vector<int> initialApples, advX, advY;
vector<PII> swapPlan;

bool checkRounds(int rounds) {
    swapPlan.clear();
    swapPlan.resize(rounds, MP(0, 0));

    // slotMapping[i] = plate at slot i
    vector<int> slotMapping(sizeN);
    // currApple[i] = apple at slot i
    vector<int> currApple(sizeN);
    // positionOfApple[v] = slot of apple v
    vector<int> positionOfApple(sizeN);
    // platePosition[p] = slot of plate p
    vector<int> platePosition(sizeN);

    for (int i = 0; i < sizeN; ++i) {
        currApple[i] = initialApples[i];
        positionOfApple[currApple[i]] = i;
        slotMapping[i] = i;
        platePosition[i] = i;
    }

    int nextApple = 0;
    for (int i = 0; i < rounds; ++i) {
        int x = advX[i], y = advY[i];
        // adversary swaps plates
        swap(slotMapping[x], slotMapping[y]);
        platePosition[slotMapping[x]] = x;
        platePosition[slotMapping[y]] = y;

        // adversary swaps apples
        swap(currApple[x], currApple[y]);
        positionOfApple[currApple[x]] = x;
        positionOfApple[currApple[y]] = y;

        // skip correct apples
        while (nextApple < sizeN &&
               positionOfApple[nextApple] == platePosition[nextApple]) {
            ++nextApple;
        }
        if (nextApple == sizeN) break;

        // fix nextApple
        int from = positionOfApple[nextApple];
        int to   = platePosition[nextApple];
        swapPlan[i] = MP(from, to);
        swap(currApple[from], currApple[to]);
        positionOfApple[currApple[from]] = from;
        positionOfApple[currApple[to]]   = to;
    }

    // final check
    while (nextApple < sizeN &&
           positionOfApple[nextApple] == platePosition[nextApple]) {
        ++nextApple;
    }
    return nextApple == sizeN;
}

int findSwapPairs(int N, int S[], int M,
                  int X[], int Y[],
                  int P[], int Q[])
{
    sizeN = N;
    initialApples.assign(S, S + N);
    advX.assign(X, X + M);
    advY.assign(Y, Y + M);

    int lo = -1, hi = M + 1;
    while (lo + 1 < hi) {
        int mid = (lo + hi) >> 1;
        if (checkRounds(mid)) hi = mid;
        else                  lo = mid;
    }
    checkRounds(hi);
    for (int i = 0; i < hi; ++i) {
        P[i] = swapPlan[i].FI;
        Q[i] = swapPlan[i].SE;
    }
    return hi;
}
#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...