# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
984976 | LucaIlie | Sorting (IOI15_sorting) | C++17 | 2 ms | 2664 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "sorting.h"
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 2e5;
int t[MAX_N], perm[MAX_N], vis[MAX_N], pos[MAX_N];
vector<pair<int, int>> sol;
int getR( int n, int s[], int k, int x[], int y[], int p[], int q[] ) {
for ( int i = 0; i < n; i++ )
t[i] = i, pos[i] = i;
for ( int i = 0; i < k; i++ ) {
swap( t[pos[x[i]]], t[pos[y[i]]] );
swap( pos[x[i]], pos[y[i]] );
}
for ( int i = 0; i < n; i++ )
perm[t[i]] = s[i];//, printf( "%d ", t[i] );
//printf( "\n\n" );
for ( int i = 0; i < n; i++ )
vis[i] = false;
sol.clear();
for ( int i = 0; i < n; i++ ) {
//printf( "%d ", perm[i] );
if ( vis[i] )
continue;
int j = i;
vector<pair<int, int>> v;
do {
vis[j] = true;
if ( perm[j] != j && j != i )
v.push_back( { j, perm[j] } );
j = perm[j];
} while ( j != i );
//reverse( v.begin(), v.end() );
for ( pair<int, int> swp: v )
sol.push_back( swp );
}
//printf( "\n" );
return sol.size();
}
int findSwapPairs( int n, int s[], int m, int x[], int y[], int p[], int q[] ) {
int l = 0, r = m;
while ( r - l > 1 ) {
int k = (l + r) / 2;
int rr = getR( n, s, k, x, y, p, q );
//printf( "%d %d\n", k, rr );
if ( rr > k )
l = k;
else
r = k;
}
getR( n, s, r, x, y, p, q );
for ( int i = 0; i < n; i++ )
pos[s[i]] = i;
for ( int i = 0; i < r; i++ ) {
//for ( int j = 0; j < n; j++ )
// printf( "%d ", pos[j] );
//printf( "\n" );
swap( pos[s[x[i]]], pos[s[y[i]]] );
swap( s[x[i]], s[y[i]] );
//for ( int j = 0; j < n; j++ )
// printf( "%d ", pos[j] );
//printf( "\n" );
if ( i < sol.size() ) {
//printf( "%d %d\n", sol[i].first, sol[i].second );
p[i] = pos[sol[i].first];
q[i] = pos[sol[i].second];
swap( pos[sol[i].first], pos[sol[i].second] );
swap( s[p[i]], s[q[i]] );
} else {
p[i] = 0;
q[i] = 0;
}
//for ( int j = 0; j < n; j++ )
// printf( "%d ", s[j] );
//printf( "\n\n" );
}
//for ( int i = 0; i < n; i++ )
// cout << s[i] << "\n";
return r;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |