#include <iostream> #include <numeric> #include "message.h" #include "teatr.h" //#include "bits/stdc++.h" struct Node { int data; int leftSubTreeSize; int dup; Node *left, *right; Node(int x) { data = x; leftSubTreeSize = 0; dup = 1; left = right = NULL; } }; Node *insert(Node *root, int key, int *countArray, int index) { if (!root)return (new Node(key)); if (key > root->data) { root->right = insert(root->right, key, countArray, index); countArray[index] = countArray[index] + root->leftSubTreeSize + root->dup; } else if (key < root->data) { root->left = insert(root->left, key, countArray, index); root->leftSubTreeSize += 1; } else if (key == root->data) { root->dup += 1; countArray[index] += root->leftSubTreeSize; } return root; } int *countSmaller(int *A, int N) { int *countArray = new int[N]; for (int i = 0; i < N; i++) countArray[i] = 0; Node *root = NULL; for (int i = N - 1; i >= 0; i--) root = insert(root, A[i], countArray, i); return countArray; } long long arraySum(int a[], int n) { long long initial_sum = 0; return std::accumulate(a, a + n, initial_sum); } int main() { if (MyNodeId() != 0) return 0; int N = GetN(); int *A = new int[N+1]; for (int i = 0; i < N; i++) A[i]=GetElement(i); int *res = countSmaller(A, N); std::cout << arraySum(res,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 62 63 64 | #include <iostream> #include <numeric> #include "message.h" #include "teatr.h" //#include "bits/stdc++.h" struct Node { int data; int leftSubTreeSize; int dup; Node *left, *right; Node(int x) { data = x; leftSubTreeSize = 0; dup = 1; left = right = NULL; } }; Node *insert(Node *root, int key, int *countArray, int index) { if (!root)return (new Node(key)); if (key > root->data) { root->right = insert(root->right, key, countArray, index); countArray[index] = countArray[index] + root->leftSubTreeSize + root->dup; } else if (key < root->data) { root->left = insert(root->left, key, countArray, index); root->leftSubTreeSize += 1; } else if (key == root->data) { root->dup += 1; countArray[index] += root->leftSubTreeSize; } return root; } int *countSmaller(int *A, int N) { int *countArray = new int[N]; for (int i = 0; i < N; i++) countArray[i] = 0; Node *root = NULL; for (int i = N - 1; i >= 0; i--) root = insert(root, A[i], countArray, i); return countArray; } long long arraySum(int a[], int n) { long long initial_sum = 0; return std::accumulate(a, a + n, initial_sum); } int main() { if (MyNodeId() != 0) return 0; int N = GetN(); int *A = new int[N+1]; for (int i = 0; i < N; i++) A[i]=GetElement(i); int *res = countSmaller(A, N); std::cout << arraySum(res,N); return 0; } |