#include <cstdio> #include "teatr.h" #include "message.h" using namespace std; int *A; long long mergeInversions(int p, int q, int r) { int n1 = q - p + 1; int n2 = r - q; int *L = new int[n1 + 2]; int *R = new int[n2 + 2]; for (int i = 1; i <= n1; i++) { L[i] = A[p + i - 1]; } for (int j = 1; j <= n2; j++) { R[j] = A[q + j]; } L[n1 + 1] = R[n2 + 1] = 2000000000; int i = 1, j = 1; long long inversions = 0; for (int k = p; k <= r; k++) { if (L[i] <= R[j]) { A[k] = L[i]; i++; } else { A[k] = R[j]; j++; inversions += n1 - i + 1; } } delete[] L; delete[] R; return inversions; } long long countInversions(int p, int r) { long long inversions = 0; if (p < r) { int q = (p + r) / 2; inversions += countInversions(p, q); inversions += countInversions(q + 1, r); inversions += mergeInversions(p, q, r); } return inversions; } int main() { int n = GetN(); A = new int[n]; int id = MyNodeId(); if (id == 0) { for (int k = 0; k < n; k++) { A[k + 1] = GetElement(k); } printf("%lld\n", countInversions(1, n)); } 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 | #include <cstdio> #include "teatr.h" #include "message.h" using namespace std; int *A; long long mergeInversions(int p, int q, int r) { int n1 = q - p + 1; int n2 = r - q; int *L = new int[n1 + 2]; int *R = new int[n2 + 2]; for (int i = 1; i <= n1; i++) { L[i] = A[p + i - 1]; } for (int j = 1; j <= n2; j++) { R[j] = A[q + j]; } L[n1 + 1] = R[n2 + 1] = 2000000000; int i = 1, j = 1; long long inversions = 0; for (int k = p; k <= r; k++) { if (L[i] <= R[j]) { A[k] = L[i]; i++; } else { A[k] = R[j]; j++; inversions += n1 - i + 1; } } delete[] L; delete[] R; return inversions; } long long countInversions(int p, int r) { long long inversions = 0; if (p < r) { int q = (p + r) / 2; inversions += countInversions(p, q); inversions += countInversions(q + 1, r); inversions += mergeInversions(p, q, r); } return inversions; } int main() { int n = GetN(); A = new int[n]; int id = MyNodeId(); if (id == 0) { for (int k = 0; k < n; k++) { A[k + 1] = GetElement(k); } printf("%lld\n", countInversions(1, n)); } return 0; } |