#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; } |