Submission #387242

#TimeUsernameProblemLanguageResultExecution timeMemory
387242KeshiSorting (IOI15_sorting)C++17
100 / 100
206 ms30104 KiB
//In the name of God
#include <bits/stdc++.h>
#include "sorting.h"
using namespace std;

typedef int ll;
typedef pair<ll, ll> pll;

const ll maxn = 2e5 + 100;
const ll mod = 1e9 + 7;
const ll inf = 1e9;

#define fast_io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io freopen("input.txt", "r+", stdin);freopen("output.txt", "w+", stdout);
#define pb push_back
#define Mp make_pair
#define F first
#define S second
#define Sz(x) ll((x).size())
#define all(x) (x).begin(), (x).end()

int g[maxn], a[maxn], b[maxn];
bool vis[maxn];
int n, x[maxn], y[maxn], s[maxn];

bool ok(ll j){
	for(ll i = 0; i < n; i++){
		a[i] = s[i];
	}
	for(ll i = 0; i < j; i++){
		swap(a[x[i]], a[y[i]]);
	}
		for(ll i = 0; i < n; i++){
			g[a[i]] = i;
			vis[i] = 0;
		}
		ll cnt = 0;
		for(ll i = 0; i < n; i++){
			if(vis[i]) continue;
			cnt++;
			ll v = i;
			do{
				vis[v] = 1;
				v = g[v];
			}while(v != i);
		}
	return (j >= n - cnt);
}

int findSwapPairs(int N, int S[], int m, int X[], int Y[], int p[], int q[]) {
	n = N;
	for(ll i = 0; i < n; i++){
		s[i] = S[i];
		x[i] = X[i];
		y[i] = Y[i];
	}
	ll l = -1, r = n, mid;
	while(r - l > 1){
		mid = (l + r) >> 1;
		if(ok(mid)) r = mid;
		else l = mid;
	}
	ll j = r;
	for(ll i = 0; i < n; i++){
		a[i] = s[i];
	}
	for(ll i = 0; i < j; i++){
		swap(a[x[i]], a[y[i]]);
	}
		for(ll i = 0; i < n; i++){
			g[a[i]] = i;
			vis[i] = 0;
		}
		vector<vector<ll> > vec;
		for(ll i = 0; i < n; i++){
			if(vis[i]) continue;
			vector<ll> v2;
			ll v = i;
			do{
				vis[v] = 1;
				v2.pb(v);
				v = g[v];
			}while(v != i);
			vec.pb(v2);
		}
			vector<ll> v2(10);
			vec.pb(v2);
			ll p1 = 0;
			ll p2 = 1;
			for(ll i = 0; i < n; i++){
				b[s[i]] = i;
			}
			for(ll o = 0; o < j; o++){
				swap(s[x[o]], s[y[o]]);
				swap(b[s[x[o]]], b[s[y[o]]]);
				while(p2 == Sz(vec[p1])){
					p1++;
					p2 = 1;
				}
				p[o] = b[vec[p1][0]];
				q[o] = b[vec[p1][p2]];
				p2++;
				swap(s[p[o]], s[q[o]]);
				swap(b[s[p[o]]], b[s[q[o]]]);
			}
	/*		cout << j << "\n";
			for(ll i = 0; i < j; i++){
				cout << p[i] << " " << q[i] << "\n";
			}*/
			return j;
}


/*int main(){
    fast_io;



    return 0;
}*/

Compilation message (stderr)

sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:50:39: warning: unused parameter 'm' [-Wunused-parameter]
   50 | int findSwapPairs(int N, int S[], int m, int X[], int Y[], int p[], int q[]) {
      |                                   ~~~~^
#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...