// again - 100% lame approach...
// not distributed, just copy from:
// C++ program to count inversions using Binary Indexed Tree
// https://www.geeksforgeeks.org/count-inversions-array-set-3-using-bit/
// actually it looks like single instance can read all the data - isn't that too easy?
#include "message.h"
#include "teatr.h"
#include <bits/stdc++.h>
using namespace std;
/*
//compiles, so go :)
vector<int> DATA = {5, 2, 4, 4, 3};
int GetElement(int i) {
return DATA[i % DATA.size()];
}
int GetN() {
return DATA.size();
}
int MyNodeId() {return 0;}
int NumberOfNodes() {return 1;}
long long GetLL(int source) {return 0;}
int GetInt(int source) {return 0;}
int Receive(int source) {return 0;}
void Send(int target) {}
void PutInt(int target, int value) {}
void PutLL(int target, long long value) {}
/*
*/
typedef vector<uint64_t> BITree_t;
uint64_t getSum(BITree_t& BITree, int index) {
uint64_t sum = 0;
while (index > 0) {
sum += BITree[index];
index -= index & (-index);
}
return sum;
}
void updateBIT(BITree_t& BITree, int index, int val) {
while (index < BITree.size()) {
BITree[index] += val;
index += index & (-index);
}
}
int main() {
int n = GetN();
int histSize = 1000010;
int nodeId = MyNodeId();
int instances = NumberOfNodes();
int i0 = n * (nodeId) / instances;
int i1 = n * (nodeId + 1) / instances;
vector<int> hist(histSize);
for (int i = i1; i < n; i++) {
hist[GetElement(i)]++;
}
//calculate partial result
BITree_t BIT(histSize + 1);
for (int elem = 1; elem < hist.size(); elem++) {
if (hist[elem] > 0)
updateBIT(BIT, elem, hist[elem]);
}
uint64_t invcount = 0;
for (int i = i1 - 1; i >= i0; i--) {
int elem = GetElement(i);
invcount += getSum(BIT, elem - 1);
updateBIT(BIT, elem, 1);
}
if (nodeId != 0) {
PutLL(0, invcount);
Send(0);
} else {
for (int k = 1; k < instances; k++) {
Receive(k);
invcount += GetLL(k);
}
cout << invcount << "\n";
}
}
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 | // again - 100% lame approach... // not distributed, just copy from: // C++ program to count inversions using Binary Indexed Tree // https://www.geeksforgeeks.org/count-inversions-array-set-3-using-bit/ // actually it looks like single instance can read all the data - isn't that too easy? #include "message.h" #include "teatr.h" #include <bits/stdc++.h> using namespace std; /* //compiles, so go :) vector<int> DATA = {5, 2, 4, 4, 3}; int GetElement(int i) { return DATA[i % DATA.size()]; } int GetN() { return DATA.size(); } int MyNodeId() {return 0;} int NumberOfNodes() {return 1;} long long GetLL(int source) {return 0;} int GetInt(int source) {return 0;} int Receive(int source) {return 0;} void Send(int target) {} void PutInt(int target, int value) {} void PutLL(int target, long long value) {} /* */ typedef vector<uint64_t> BITree_t; uint64_t getSum(BITree_t& BITree, int index) { uint64_t sum = 0; while (index > 0) { sum += BITree[index]; index -= index & (-index); } return sum; } void updateBIT(BITree_t& BITree, int index, int val) { while (index < BITree.size()) { BITree[index] += val; index += index & (-index); } } int main() { int n = GetN(); int histSize = 1000010; int nodeId = MyNodeId(); int instances = NumberOfNodes(); int i0 = n * (nodeId) / instances; int i1 = n * (nodeId + 1) / instances; vector<int> hist(histSize); for (int i = i1; i < n; i++) { hist[GetElement(i)]++; } //calculate partial result BITree_t BIT(histSize + 1); for (int elem = 1; elem < hist.size(); elem++) { if (hist[elem] > 0) updateBIT(BIT, elem, hist[elem]); } uint64_t invcount = 0; for (int i = i1 - 1; i >= i0; i--) { int elem = GetElement(i); invcount += getSum(BIT, elem - 1); updateBIT(BIT, elem, 1); } if (nodeId != 0) { PutLL(0, invcount); Send(0); } else { for (int k = 1; k < instances; k++) { Receive(k); invcount += GetLL(k); } cout << invcount << "\n"; } } |
English