Submission #1193715

#TimeUsernameProblemLanguageResultExecution timeMemory
1193715tkm_algorithmsSorting (IOI15_sorting)C++20
100 / 100
192 ms13944 KiB
/**
*    In the name of Allah
*    We are nothing and you're everything
**/
#include <bits/stdc++.h>
#include "sorting.h"

using namespace std;
using ll = long long;

#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()

const int MAX = 2e5+5;
int *s, *x, *y, *p, *q, n;
int obj[MAX], cur[MAX];
int orev[MAX], crev[MAX];

bool trial(int t) {
	for (int i = 0; i < n; ++i)obj[i] = i;
	
	for (int i = t-1; i >= 0; --i)swap(obj[x[i]], obj[y[i]]);
	
	for (int i = 0; i < n; ++i)
		orev[obj[i]] = i,
		cur[i] = s[i],
		crev[s[i]] = i;
	
	int pt = 0;
	for (int i = 0; i < t; ++i)	{
		swap(obj[x[i]], obj[y[i]]);
		swap(cur[x[i]], cur[y[i]]);
		crev[cur[x[i]]] = x[i];
		orev[obj[x[i]]] = x[i];
		crev[cur[y[i]]] = y[i];
		orev[obj[y[i]]] = y[i];
		while (pt < n && crev[pt] == orev[pt])pt += 1;
		if (pt == n) {
			p[i] = q[i] = 0;
			continue;
		}
		
		int p1 = crev[pt];
		int p2 = orev[pt];
		p[i] = p1, q[i] = p2;
		swap(cur[p1], cur[p2]);
		crev[cur[p1]] = p1;
		crev[cur[p2]] = p2;
	}
	
	while (pt < n && crev[pt] == orev[pt])pt += 1;
	return (pt == n);
}

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
	n = N, s = S, x = X, y = Y, p = P, q = Q;
	int l = 0, r = M;
	while (l != r) {
		int m = l+r>>1;
		if (trial(m))r = m;
		else l = m+1;
	}
	
	trial(l);
	return l;
}
#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...