sandeep03edu

arc147 == B - Swap to Sort

Sep 10th, 2022 (edited)
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define MOD 1000000007;
  5.  
  6. #define got cout<<"YES\n"; return;
  7. #define got0 cout<<"YES\n"; return 0;
  8.  
  9. #define bhak cout<<"NO\n"; return;
  10. #define bhak0 cout<<"NO\n"; return 0;
  11.  
  12. #define bas cout<<"\n";
  13.  
  14. int main() {
  15.     // your code goes here
  16.     vector<ll> odd;
  17.    
  18.     ll n; cin>>n;
  19.     vector<ll> vec(n);
  20.    
  21.     map<ll,ll> pos;
  22.    
  23.     for(ll i=0; i<n; ++i){
  24.         cin>>vec[i];
  25.         ll diff = vec[i] - (i+1);
  26.         pos[vec[i]] = i;
  27.        
  28.         if(diff==0) continue;
  29.         if(diff%2!=0){
  30.             odd.push_back(vec[i]);
  31.         }
  32.     }
  33.    
  34.     vector<pair<ll,ll>> ans;
  35.    
  36.     // Swapping all odd parity difference one's with 1 A operation and other B operation
  37.     for(ll i=0; i<odd.size(); i+=2){
  38.         ll a = odd[i], b = odd[i+1];
  39.        
  40.         ll start = min(pos[a], pos[b]);
  41.         ll end = max(pos[a], pos[b]);
  42.        
  43.         while(start!=end-1){
  44.             pos[vec[start]] = start+2;
  45.             pos[vec[start+2]] = start;
  46.             swap(vec[start],vec[start+2]);
  47.            
  48.             ans.push_back({2, start});
  49.             start +=2;
  50.         }
  51.        
  52.         pos[vec[start]] = start+1;
  53.         pos[vec[start+1]] = start;
  54.         swap(vec[start], vec[start+1]);
  55.         ans.push_back({1, start});
  56.     }
  57.    
  58.     // Selection sort with all 'B' operations
  59.     for(ll i=1; i<=n; ++i){
  60.         ll start = min(i-1, pos[i]);
  61.         ll end = max(i-1, pos[i]);
  62.        
  63.         if(start==end) continue;
  64.        
  65.         while(start!=end){
  66.             pos[vec[start]] = start+2;
  67.             pos[vec[start+2]] = start;
  68.             swap(vec[start], vec[start+2]);
  69.  
  70.             ans.push_back({2, start});
  71.             start+=2;
  72.         }
  73.     }
  74.  
  75.    
  76.     cout<<ans.size(); bas
  77.     for(auto pr : ans){
  78.         ll a = pr.first, b = pr.second;
  79.        
  80.         if(a==1){
  81.             cout<<"A ";
  82.         }
  83.         else{
  84.             cout<<"B ";
  85.         }
  86.        
  87.         cout<<b+1; bas
  88.     }
  89.    
  90.     return 0;
  91. }
  92.  
Advertisement
Add Comment
Please, Sign In to add comment