#include <iostream>
#include "message.h"
#include "teatr.h"
using namespace std;
int n;
int k;
/*
int GetN() {
cin >> n;
return n;
}
int GetElement(int i){
cin >> k;
return k;
}
int MyNodeId(){
return 0;
}
*/
int numbers[20000000];
int mergetemp[20000000];
// sorts the 'numbers' array;
// uses the 'mergetemp' array;
// returns number of inversions
long long int mergesort(int begin, int end){
int mid = (begin + end) / 2;
if (begin == end) {
return 0;
}
long long int r1 = mergesort(begin, mid);
long long int r2 = mergesort(mid+1, end);
long long int invs = 0;
int leftpos = begin;
int rightpos = mid+1;
int tempidx = begin;
while(leftpos != mid+1 || rightpos != end+1){
if(rightpos == end+1) {
while(leftpos != mid+1){
mergetemp[tempidx] = numbers[leftpos];
leftpos++;
tempidx++;
}
} else if(leftpos == mid+1){
while(rightpos != end+1) {
mergetemp[tempidx] = numbers[rightpos];
rightpos++;
tempidx++;
}
} else {
if (numbers[leftpos] <= numbers[rightpos]){
mergetemp[tempidx] = numbers[leftpos];
leftpos++;
tempidx++;
} else {
mergetemp[tempidx] = numbers[rightpos];
rightpos++;
tempidx++;
invs += mid + 1 - leftpos;
}
}
}
for(int i = begin; i <= end; ++i){
numbers[i] = mergetemp[i];
}
return r1 + r2 + invs;
}
int main(){
int nodeid = MyNodeId();
if(nodeid != 0){
return 0;
}
n = GetN();
for (int i = 0; i < n; ++i){
numbers[i] = GetElement(i);
}
long long int res = mergesort(0, n-1);
cout << res << endl;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #include <iostream> #include "message.h" #include "teatr.h" using namespace std; int n; int k; /* int GetN() { cin >> n; return n; } int GetElement(int i){ cin >> k; return k; } int MyNodeId(){ return 0; } */ int numbers[20000000]; int mergetemp[20000000]; // sorts the 'numbers' array; // uses the 'mergetemp' array; // returns number of inversions long long int mergesort(int begin, int end){ int mid = (begin + end) / 2; if (begin == end) { return 0; } long long int r1 = mergesort(begin, mid); long long int r2 = mergesort(mid+1, end); long long int invs = 0; int leftpos = begin; int rightpos = mid+1; int tempidx = begin; while(leftpos != mid+1 || rightpos != end+1){ if(rightpos == end+1) { while(leftpos != mid+1){ mergetemp[tempidx] = numbers[leftpos]; leftpos++; tempidx++; } } else if(leftpos == mid+1){ while(rightpos != end+1) { mergetemp[tempidx] = numbers[rightpos]; rightpos++; tempidx++; } } else { if (numbers[leftpos] <= numbers[rightpos]){ mergetemp[tempidx] = numbers[leftpos]; leftpos++; tempidx++; } else { mergetemp[tempidx] = numbers[rightpos]; rightpos++; tempidx++; invs += mid + 1 - leftpos; } } } for(int i = begin; i <= end; ++i){ numbers[i] = mergetemp[i]; } return r1 + r2 + invs; } int main(){ int nodeid = MyNodeId(); if(nodeid != 0){ return 0; } n = GetN(); for (int i = 0; i < n; ++i){ numbers[i] = GetElement(i); } long long int res = mergesort(0, n-1); cout << res << endl; return 0; } |
English