Submission #419219

#TimeUsernameProblemLanguageResultExecution timeMemory
419219MounirSorting (IOI15_sorting)C++14
0 / 100
1 ms332 KiB
#include "sorting.h" #include <bits/stdc++.h> #define sz(x) (int)x.size() #define chmax(x, v) x = max(x, v) #define chmin(x, v) x = min(x, v) #define all(x) x.begin(), x.end() #define pb push_back #define pii pair<int, int> #define x first #define y second using namespace std; const int N_VALS = 1e6; int nVals, nTours; vector<int> vals, tmp; vector<pii> modifs; bool vu[N_VALS]; int nCycles(){ for (int ind = 0; ind < nVals; ++ind) vu[ind] = false; int nb = 0; //cout << "BEGIN" << endl; for (int depart = 0; depart < nVals; ++depart){ if (!vu[depart]){ nb++; vu[depart] = true; int noeud = vals[depart]; while (noeud != depart){ vu[noeud] = true; noeud = vals[noeud]; } } } //cout << "END" << endl; return nb; } void faireSwaps(int borneMax){ for (int ind = 0; ind < nVals; ++ind) vals[ind] = tmp[ind]; for (int ind = 1; ind < borneMax; ++ind) swap(vals[modifs[ind].x], vals[modifs[ind].y]); } int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) { //initialisation. nVals = N, nTours = M; vals.resize(nVals), tmp.resize(nVals); for (int ind = 0; ind < nVals; ++ind) vals[ind] = tmp[ind] = S[ind]; modifs.resize(nTours + 1); for (int ind = 0; ind < nTours; ++ind) modifs[ind + 1] = {X[ind], Y[ind]}; //Dichotomie pour trouver R. int gauche = 0, droite = nTours + 1; //vu que la fin est exclue while (droite > gauche){ int milieu = (droite + gauche)/2; faireSwaps(milieu); // cout << "m " << milieu << " " << gauche << " " << droite << endl; /* cout << "MILIEU " << milieu << " " << nCycles() << endl; for (int val : vals) cout << val << " "; cout << endl; */ if (milieu >= nVals - nCycles()) droite = milieu; else gauche = milieu + 1; } int res = gauche - 1; faireSwaps(res); int nb = 0; for (int ind = 0; ind < nVals; ++ind){ while (vals[ind] != ind){ P[nb] = ind; Q[nb] = vals[ind]; swap(vals[ind], vals[vals[ind]]); nb++; } } while (nb < res) P[nb] = Q[nb++] = 0; /* for (int ind = 0; ind < res; ++ind) cout << P[ind] << " " << Q[ind] << endl; */ vector<int> permutation(nVals); for (int ind = 0; ind < nVals; ++ind) permutation[ind] = ind; for (int iModif = res; iModif >= 0; --iModif){ swap(vals[permutation[modifs[iModif].x]], vals[permutation[modifs[iModif].y]]); swap(permutation[modifs[iModif].x], permutation[modifs[iModif].y]); P[iModif] = vals[P[iModif]]; Q[iModif] = vals[Q[iModif]]; } /* cout << "SALUT\n"; for (int ind = 0; ind <= res; ++ind){ cout << "TOUR\n"; cout << X[ind] << " " << Y[ind] << endl; cout << P[ind] << " " << Q[ind] << endl; swap(vals[X[ind]], vals[Y[ind]]); swap(vals[P[ind]], vals[Q[ind]]); } */ return res; }

Compilation message (stderr)

sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:100:16: warning: operation on 'nb' may be undefined [-Wsequence-point]
  100 |    P[nb] = Q[nb++] = 0;
      |              ~~^~
sorting.cpp:100:16: warning: operation on 'nb' may be undefined [-Wsequence-point]
#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...