Submission #100961

#TimeUsernameProblemLanguageResultExecution timeMemory
100961luciocfSorting (IOI15_sorting)C++14
100 / 100
614 ms24184 KiB
#include <bits/stdc++.h> #include "sorting.h" using namespace std; const int maxn = 2e5+10; const int maxm = 6e5+10; typedef pair<int, int> pii; int s[maxn], final[maxn], pos[maxn], pos_final[maxn]; // checa se S está ordenado bool check(int N) { for (int i = 0; i < N; i++) if (s[i] != i) return false; return true; } // Faz a operação de trocar os índices void replace(int i, int j, bool q) { int a, b; if (q) { a = s[i], b = s[j]; s[i] = b, s[j] = a; pos[a] = j, pos[b] = i; } else { a = final[i], b = final[j]; final[i] = b, final[j] = a; pos_final[a] = j, pos_final[b] = i; } } int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) { for (int i = 0; i < N; i++) final[i] = s[i] = S[i], pos_final[s[i]] = pos[s[i]] = i; if (check(N)) return 0; int ini = 1, fim = N+1, ans = N+1; vector<int> curP(M), curQ(M); while (ini <= fim) { int mid = (ini+fim)>>1; for (int i = 0; i < N; i++) final[i] = s[i] = S[i], pos_final[s[i]] = pos[s[i]] = i; for (int i = 0; i < mid; i++) replace(X[i], Y[i], 0); int first = 0; for (int j = 0; j < mid; j++) { replace(X[j], Y[j], 1); for (int i = first; i < N; i++) { if (final[i] == i) { first++; curP[j] = curQ[j] = 0; continue; } curP[j] = pos[i], curQ[j] = pos[final[i]]; replace(curP[j], curQ[j], 1); replace(pos_final[i], i, 0); first++; break; } } if (check(N)) { fim = mid-1, ans = mid; for (int i = 0; i < ans; i++) P[i] = curP[i], Q[i] = curQ[i]; } else ini = mid+1; } return ans; }
#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...