Submission #1060402

#TimeUsernameProblemLanguageResultExecution timeMemory
1060402steveonalexSorting (IOI15_sorting)C++17
100 / 100
114 ms14960 KiB
#include <bits/stdc++.h> #include "sorting.h" using namespace std; typedef long long ll; typedef unsigned long long ull; #define MASK(i) (1LL << (i)) #define GETBIT(mask, i) (((mask) >> (i)) & 1) #define ALL(v) (v).begin(), (v).end() #define block_of_code if(true) ll max(ll a, ll b){return (a > b) ? a : b;} ll min(ll a, ll b){return (a < b) ? a : b;} ll gcd(ll a, ll b){return __gcd(a, b);} ll lcm(ll a, ll b){return a / gcd(a, b) * b;} ll LASTBIT(ll mask){return (mask) & (-mask);} int pop_cnt(ll mask){return __builtin_popcountll(mask);} int ctz(ull mask){return __builtin_ctzll(mask);} int logOf(ull mask){return 63 - __builtin_clzll(mask);} mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); ll rngesus(ll l, ll r){return l + (ull) rng() % (r - l + 1);} template <class T1, class T2> bool maximize(T1 &a, T2 b){ if (a < b) {a = b; return true;} return false; } template <class T1, class T2> bool minimize(T1 &a, T2 b){ if (a > b) {a = b; return true;} return false; } template <class T> void printArr(T container, string separator = " ", string finish = "\n", ostream &out = cout){ for(auto item: container) out << item << separator; out << finish; } template <class T> void remove_dup(vector<T> &a){ sort(ALL(a)); a.resize(unique(ALL(a)) - a.begin()); } int findSwapPairs(int n, int a[], int m, int x[], int y[], int p[], int q[]) { minimize(m, n); int L = 0, R = m; while(L < R){ int mid = (L + R) >> 1; vector<int> perm(n); for(int i = 0; i < n; ++i) perm[i] = a[i]; for(int i = 0; i < mid; ++i){ swap(perm[x[i]], perm[y[i]]); } vector<bool> visited(n); int cnt = 0; for(int i = 0; i<n; ++i) if (!visited[i]) { int u = i; while(!visited[u]){ visited[u] = true; if (!visited[perm[u]]) cnt++; u = perm[u]; } } if (cnt <= mid) R = mid; else L = mid + 1; } vector<int> perm(n); for(int i = 0; i < n; ++i) perm[i] = a[i]; for(int i = 0; i < R; ++i) swap(perm[x[i]], perm[y[i]]); vector<bool> visited(n); vector<pair<int,int>> swaps; for(int i = 0; i<n; ++i) if (!visited[i]) { int u = i; while(!visited[u]){ visited[u] = true; if (!visited[perm[u]]) swaps.push_back({u, perm[u]}); u = perm[u]; } } reverse(ALL(swaps)); vector<int> pos(n); for(int i = 0; i<n; ++i) perm[i] = a[i]; for(int i = 0; i<n; ++i) pos[perm[i]] = i; for(int i = 0; i < R; ++i){ int u = x[i], v = y[i]; swap(perm[u], perm[v]); swap(pos[perm[u]], pos[perm[v]]); if (swaps.size()){ u = pos[swaps.back().first], v = pos[swaps.back().second]; swaps.pop_back(); } else u = v = 0; swap(perm[u], perm[v]); swap(pos[perm[u]], pos[perm[v]]); p[i] = u, q[i] = v; } return R; } // int main(void){ // ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); // clock_t start = clock(); // int n; cin >> n; // int a[n]; // for(int i = 0; i<n; ++i) cin >> a[i]; // int m; cin >> m; // int x[m], y[m]; // for(int i = 0; i<m; ++i) cin >> x[i] >> y[i]; // int p[m], q[m]; // memset(p, -1, sizeof p); memset(q, -1, sizeof q); // int r = findSwapPairs(n, a, m, x, y, p, q); // cout << r << "\n"; // for(int i = 0; i < r; ++i) { // swap(a[x[i]], a[y[i]]); // swap(a[p[i]], a[q[i]]); // cout << p[i] << " " << q[i] << "\n"; // } // for(int i = 0; i < n; ++i) cout << a[i] << " "; cout << "\n"; // cerr << "Time elapsed: " << clock() - start << " ms\n"; // return 0; // } /* 5 4 3 2 1 0 6 0 1 1 2 2 3 3 4 0 1 1 2 */
#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...