/*
AMAZON OA
Understanding :- Given two arrays “A” and “B” -> do minimum number of operations to make sure A[i]!=B[i]
-> In one operation you can swap (i,j) on array A
*/
/*******************************/
#include<iostream>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<unordered_map>
using namespace std;
int main( )
{
int opr = 0 ;
// vector<int> arr1= {1, 5, 3, 1, 3};
// vector<int> arr2= {1, 5, 3, 5, 1};
vector< int > arr1= { 2 , 2 , 1 , 1 , 2 } ;
vector< int > arr2= { 2 , 1 , 1 , 1 , 2 } ;
priority_queue< pair< int , int > > badbonds;
vector< pair< int , int > > goodbonds;
unordered_map< int , int > cnt;
for ( int i= 0 ; i< arr1.size ( ) ; i++ )
{
if ( arr1[ i] == arr2[ i] ) cnt[ arr1[ i] ] ++ ;
else goodbonds.push_back ( { arr1[ i] , arr2[ i] } ) ;
}
int maxFreq = 0 ;
for ( auto it: cnt)
{
badbonds.push ( { it.second , it.first } ) ;
maxFreq = max( maxFreq, it.second ) ;
}
while ( badbonds.size ( ) > 1 ) //run unitl a single badbond is left which cannot be paired with any badbond as it is the single one left
{
auto firstbond = badbonds.top ( ) ;
badbonds.pop ( ) ;
auto secondbond = badbonds.top ( ) ;
badbonds.pop ( ) ;
int freq_diff = firstbond.first - secondbond.first ;
opr + = secondbond.first ;
for ( int i= 1 ; i<= secondbond.first ; i++ ) //thi is number of swaps you are doing and after this much number of operation all those became goodbond and it might be that we
//can use them for further swapping in future so save them in the goodbond array.
{
//if 33 and 55 and after swapping we will get two good bonds 35 and 53
goodbonds.push_back ( { firstbond.second , secondbond.second } ) ;
goodbonds.push_back ( { secondbond.second , firstbond.second } ) ;
}
if ( freq_diff > 0 ) badbonds.push ( { freq_diff, firstbond.second } ) ;
if ( badbonds.empty ( ) ) //i.e if zero then we are done hereitself
{
cout << " Got ans: " << opr << endl;
return 0 ;
}
}
auto badbondleft = badbonds.top ( ) ;
for ( int i= 0 ; i< goodbonds.size ( ) ; i++ ) //use the goodbonds to tackle the badbond left
{
if ( badbondleft.second ! = goodbonds[ i] .first && badbondleft.second ! = goodbonds[ i] .second ) //use goodbond only if badbone swapping element does not
//becomes equal to any one of the two goodly bonded element
{
badbondleft.first -- ;
opr++ ;
}
if ( ! badbondleft.first )
{
cout << "Got ans: " << opr << endl;
return 0 ;
}
}
cout << "not possible to solve return -1" << endl;
return 0 ;
}
LyoKQU1BWk9OIE9BClVuZGVyc3RhbmRpbmcgOi0gR2l2ZW4gdHdvIGFycmF5cyDigJxB4oCdIGFuZCDigJxC4oCdIC0+IGRvIG1pbmltdW0gbnVtYmVyIG9mIG9wZXJhdGlvbnMgdG8gbWFrZSBzdXJlIEFbaV0hPUJbaV0KIAotPiBJbiBvbmUgb3BlcmF0aW9uIHlvdSBjYW4gc3dhcCAoaSxqKSBvbiBhcnJheSBBIAoqLwogCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCgoKI2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGFsZ29yaXRobT4KI2luY2x1ZGU8bWF0aC5oPgojaW5jbHVkZTx2ZWN0b3I+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTx1bm9yZGVyZWRfbWFwPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtYWluKCkKewogICAgaW50IG9wciA9IDA7CiAgICAvLyB2ZWN0b3I8aW50PiBhcnIxPSB7MSwgNSwgMywgMSwgM307CiAgICAvLyB2ZWN0b3I8aW50PiBhcnIyPSB7MSwgNSwgMywgNSwgMX07CiAgICB2ZWN0b3I8aW50PiBhcnIxPSB7MiwgMiwgMSwgMSwgMn07CiAgICB2ZWN0b3I8aW50PiBhcnIyPSB7MiwgMSwgMSwgMSwgMn07CiAgICBwcmlvcml0eV9xdWV1ZTxwYWlyPGludCwgaW50PiA+YmFkYm9uZHM7CiAgICB2ZWN0b3I8cGFpcjxpbnQgLCBpbnQ+ID5nb29kYm9uZHM7CiAgICB1bm9yZGVyZWRfbWFwPGludCwgaW50PmNudDsKCiAgICBmb3IoaW50IGk9MDsgaTxhcnIxLnNpemUoKTsgaSsrKQogICAgewogICAgICAgIGlmKGFycjFbaV09PWFycjJbaV0pIGNudFthcnIxW2ldXSsrOwogICAgICAgIGVsc2UgZ29vZGJvbmRzLnB1c2hfYmFjayh7YXJyMVtpXSwgYXJyMltpXX0pOwogICAgfQoKICAgIGludCBtYXhGcmVxID0gMDsKICAgIGZvcihhdXRvIGl0OiBjbnQpCiAgICB7CiAgICAgICAgYmFkYm9uZHMucHVzaCh7aXQuc2Vjb25kLCBpdC5maXJzdH0pOwogICAgICAgIG1heEZyZXEgPSBtYXgobWF4RnJlcSwgaXQuc2Vjb25kKTsKICAgIH0KCiAgICB3aGlsZShiYWRib25kcy5zaXplKCk+MSkgLy9ydW4gdW5pdGwgYSBzaW5nbGUgYmFkYm9uZCBpcyBsZWZ0IHdoaWNoIGNhbm5vdCBiZSBwYWlyZWQgd2l0aCBhbnkgYmFkYm9uZCBhcyBpdCBpcyB0aGUgc2luZ2xlIG9uZSBsZWZ0CiAgICB7CiAgICAgICAgYXV0byBmaXJzdGJvbmQgPSBiYWRib25kcy50b3AoKTsKICAgICAgICBiYWRib25kcy5wb3AoKTsKICAgICAgICBhdXRvIHNlY29uZGJvbmQgPSBiYWRib25kcy50b3AoKTsKICAgICAgICBiYWRib25kcy5wb3AoKTsKICAgICAgICBpbnQgZnJlcV9kaWZmID0gZmlyc3Rib25kLmZpcnN0IC0gc2Vjb25kYm9uZC5maXJzdDsKICAgICAgICBvcHIgKz0gc2Vjb25kYm9uZC5maXJzdDsKCiAgICAgICAgZm9yKGludCBpPTE7IGk8PXNlY29uZGJvbmQuZmlyc3QgOyBpKyspIC8vdGhpIGlzIG51bWJlciBvZiBzd2FwcyB5b3UgYXJlIGRvaW5nIGFuZCAgYWZ0ZXIgdGhpcyBtdWNoIG51bWJlciBvZiBvcGVyYXRpb24gYWxsIHRob3NlIGJlY2FtZSBnb29kYm9uZCBhbmQgaXQgbWlnaHQgYmUgdGhhdCB3ZQogICAgICAgIC8vY2FuIHVzZSB0aGVtIGZvciBmdXJ0aGVyIHN3YXBwaW5nIGluIGZ1dHVyZSBzbyBzYXZlIHRoZW0gaW4gdGhlIGdvb2Rib25kIGFycmF5LgogICAgICAgIHsKICAgICAgICAgICAgLy9pZiAzMyBhbmQgNTUgYW5kIGFmdGVyIHN3YXBwaW5nIHdlIHdpbGwgZ2V0IHR3byBnb29kIGJvbmRzIDM1IGFuZCA1MwogICAgICAgICAgICBnb29kYm9uZHMucHVzaF9iYWNrKHtmaXJzdGJvbmQuc2Vjb25kLCBzZWNvbmRib25kLnNlY29uZH0pOwogICAgICAgICAgICBnb29kYm9uZHMucHVzaF9iYWNrKHtzZWNvbmRib25kLnNlY29uZCwgZmlyc3Rib25kLnNlY29uZH0pOwogICAgICAgIH0KCiAgICAgICAgaWYoIGZyZXFfZGlmZiA+IDApIGJhZGJvbmRzLnB1c2goe2ZyZXFfZGlmZiwgZmlyc3Rib25kLnNlY29uZH0pOwogICAgICAgIGlmKGJhZGJvbmRzLmVtcHR5KCkpIC8vaS5lIGlmIHplcm8gdGhlbiB3ZSBhcmUgZG9uZSBoZXJlaXRzZWxmCiAgICAgICAgewogICAgICAgICAgICBjb3V0IDw8ICIgR290IGFuczogIiA8PCBvcHIgPDwgZW5kbDsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGF1dG8gYmFkYm9uZGxlZnQgPSBiYWRib25kcy50b3AoKTsKCiAgICBmb3IoaW50IGk9MDsgaTxnb29kYm9uZHMuc2l6ZSgpOyBpKyspIC8vdXNlIHRoZSBnb29kYm9uZHMgdG8gdGFja2xlIHRoZSBiYWRib25kIGxlZnQKICAgIHsKICAgICAgICBpZihiYWRib25kbGVmdC5zZWNvbmQgIT0gZ29vZGJvbmRzW2ldLmZpcnN0ICYmIGJhZGJvbmRsZWZ0LnNlY29uZCAhPSBnb29kYm9uZHNbaV0uc2Vjb25kKSAvL3VzZSBnb29kYm9uZCBvbmx5IGlmIGJhZGJvbmUgc3dhcHBpbmcgZWxlbWVudCBkb2VzIG5vdCAKICAgICAgICAvL2JlY29tZXMgZXF1YWwgdG8gYW55IG9uZSBvZiB0aGUgdHdvIGdvb2RseSBib25kZWQgZWxlbWVudAogICAgICAgIHsKICAgICAgICAgICAgIGJhZGJvbmRsZWZ0LmZpcnN0LS07CiAgICAgICAgICAgICBvcHIrKzsKICAgICAgICB9CiAgICAgICAgaWYoIWJhZGJvbmRsZWZ0LmZpcnN0KQogICAgICAgIHsKICAgICAgICAgICAgY291dCA8PCAiR290IGFuczogIiA8PCBvcHIgPDwgZW5kbDsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIGNvdXQgPDwgIm5vdCBwb3NzaWJsZSB0byBzb2x2ZSByZXR1cm4gLTEiIDw8IGVuZGw7CgoKICAgIHJldHVybiAwOwp9