Submission #985116

#TimeUsernameProblemLanguageResultExecution timeMemory
985116LucaIlieSorting (IOI15_sorting)C++17
100 / 100
202 ms25376 KiB
#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 = -1, 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)

sorting.cpp: In function 'int getR(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:45:20: warning: conversion from 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   45 |     return sol.size();
      |            ~~~~~~~~^~
sorting.cpp:10:56: warning: unused parameter 'p' [-Wunused-parameter]
   10 | int getR( int n, int s[], int k, int x[], int y[], int p[], int q[] ) {
      |                                                    ~~~~^~~
sorting.cpp:10:65: warning: unused parameter 'q' [-Wunused-parameter]
   10 | int getR( int n, int s[], int k, int x[], int y[], int p[], int q[] ) {
      |                                                             ~~~~^~~
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:73:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |         if ( i < sol.size() ) {
      |              ~~^~~~~~~~~~~~
#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...