#include "message.h"
#include "teatr.h"
#include <vector>
#include <map>
#include <iostream>
using namespace std;
int _mergeSort(vector<int>& arr, vector<int>& temp, int left, int right);
int merge(vector<int>& arr, vector<int>& temp, int left, int mid, int right);
int mergeSort(vector<int> arr, int array_size)
{
vector<int> temp(array_size, 0);
return _mergeSort(arr, temp, 0, array_size - 1);
}
int _mergeSort(vector<int>& arr, vector<int>& temp, int left, int right)
{
int mid, inv_count = 0;
if (right > left) {
mid = (right + left) / 2;
inv_count = _mergeSort(arr, temp, left, mid);
inv_count += _mergeSort(arr, temp, mid + 1, right);
inv_count += merge(arr, temp, left, mid + 1, right);
}
return inv_count;
}
int merge(vector<int>& arr, vector<int>& temp, int left, int mid, int right)
{
int i, j, k;
int inv_count = 0;
i = left;
j = mid;
k = left;
while ((i <= mid - 1) && (j <= right)) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
}
else {
temp[k++] = arr[j++];
inv_count = inv_count + (mid - i);
}
}
while (i <= mid - 1)
temp[k++] = arr[i++];
while (j <= right)
temp[k++] = arr[j++];
for (i = left; i <= right; i++)
arr[i] = temp[i];
return inv_count;
}
using namespace std;
pair<int,int> getminmax(int n){
int max = 10000 * (n + 1) + 1;
int min = 10000 * n + 1;
return {min, max};
}
int main() {
map<int, long long> quicker;
bool solved = true;
long long n = GetN();
auto limits = getminmax(MyNodeId());
long long ret = 0;
for(int i = 0; i < n; i ++){
long long greater = 0;
int tmp = GetElement(i);
if(quicker.size() > 6){
solved = false;
break;
} else {
if(tmp > limits.second){
greater ++;
} else if (tmp >= limits.first){
ret += greater;
quicker[tmp] ++;
for(const auto& a : quicker){
if(a.first > tmp){
ret += a.second;
}
}
}
}
}
if(!solved){
vector<int> arr;
ret = 0;
long long greater = 0;
for(long long i = 0; i < n; i ++){
int tmp = GetElement(i);
if(tmp > limits.second){
greater ++;
} else if (tmp >= limits.first){
ret += greater;
arr.push_back(tmp);
}
}
ret += mergeSort(arr, arr.size());
}
if(MyNodeId() == 0){
for(long long k = 1; k < NumberOfNodes(); k ++){
Receive(k);
long long cur = GetLL(k);
ret += cur;
}
cout << ret << endl;
} else {
PutLL(0, ret);
Send(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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | #include "message.h" #include "teatr.h" #include <vector> #include <map> #include <iostream> using namespace std; int _mergeSort(vector<int>& arr, vector<int>& temp, int left, int right); int merge(vector<int>& arr, vector<int>& temp, int left, int mid, int right); int mergeSort(vector<int> arr, int array_size) { vector<int> temp(array_size, 0); return _mergeSort(arr, temp, 0, array_size - 1); } int _mergeSort(vector<int>& arr, vector<int>& temp, int left, int right) { int mid, inv_count = 0; if (right > left) { mid = (right + left) / 2; inv_count = _mergeSort(arr, temp, left, mid); inv_count += _mergeSort(arr, temp, mid + 1, right); inv_count += merge(arr, temp, left, mid + 1, right); } return inv_count; } int merge(vector<int>& arr, vector<int>& temp, int left, int mid, int right) { int i, j, k; int inv_count = 0; i = left; j = mid; k = left; while ((i <= mid - 1) && (j <= right)) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; inv_count = inv_count + (mid - i); } } while (i <= mid - 1) temp[k++] = arr[i++]; while (j <= right) temp[k++] = arr[j++]; for (i = left; i <= right; i++) arr[i] = temp[i]; return inv_count; } using namespace std; pair<int,int> getminmax(int n){ int max = 10000 * (n + 1) + 1; int min = 10000 * n + 1; return {min, max}; } int main() { map<int, long long> quicker; bool solved = true; long long n = GetN(); auto limits = getminmax(MyNodeId()); long long ret = 0; for(int i = 0; i < n; i ++){ long long greater = 0; int tmp = GetElement(i); if(quicker.size() > 6){ solved = false; break; } else { if(tmp > limits.second){ greater ++; } else if (tmp >= limits.first){ ret += greater; quicker[tmp] ++; for(const auto& a : quicker){ if(a.first > tmp){ ret += a.second; } } } } } if(!solved){ vector<int> arr; ret = 0; long long greater = 0; for(long long i = 0; i < n; i ++){ int tmp = GetElement(i); if(tmp > limits.second){ greater ++; } else if (tmp >= limits.first){ ret += greater; arr.push_back(tmp); } } ret += mergeSort(arr, arr.size()); } if(MyNodeId() == 0){ for(long long k = 1; k < NumberOfNodes(); k ++){ Receive(k); long long cur = GetLL(k); ret += cur; } cout << ret << endl; } else { PutLL(0, ret); Send(0); } } |
English