#include "message.h"
#include "teatr.h"
#include "bits/stdc++.h"
using namespace std;
//int GetN() { return int(1e8); }
//int GetElement(int i) { return (i * 1ll * i) % int(1e6) + 1; }
// Returns sum of arr[0..index]. This function assumes
// that the array is preprocessed and partial sums of
// array elements are stored in BITree[].
long getSum(long BITree[], long index)
{
long sum = 0; // Initialize result
// Traverse ancestors of BITree[index]
while (index > 0)
{
// Add current element of BITree to sum
sum += BITree[index];
// Move index to parent node in getSum View
index -= index & (-index);
}
return sum;
}
// Updates a node in Binary Index Tree (BITree) at given index
// in BITree. The given value 'val' is added to BITree[i] and
// all of its ancestors in tree.
void updateBIT(long BITree[], long n, long index, long val)
{
// Traverse all ancestors and add 'val'
while (index <= n)
{
// Add 'val' to current node of BI Tree
BITree[index] += val;
// Update index to that of parent in update View
index += index & (-index);
}
}
int main() {
// if(MyNodeId() != 0) return 0;
long n = GetN();
long long inversions = 0;
long long hits = 0;
long maxElement = 1000000;
long minEl = MyNodeId() * 10000 + 1;
long maxEl = (MyNodeId() + 1)*10000;
long BIT[10000+2];
for (long i=1; i<=10001; i++)
BIT[i] = 0;
for(long i=0; i<n; i++) {
long el = maxElement - GetElement(i);
if (el > maxEl) {
inversions += getSum(BIT, 10000);
updateBIT(BIT, 10000, 10001, 1);
} else if (el >= minEl && el <= maxEl) {
inversions += getSum(BIT, el - minEl + 1 - 1);
updateBIT(BIT, 10000, el - minEl + 1, 1);
}
}
if (MyNodeId() > 0) {
PutLL(0, inversions);
Send(0);
} else {
for (long i = 1; i < NumberOfNodes(); ++i) {
long instancja = Receive(-1);
inversions += GetLL(instancja);
}
cout << inversions << 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 | #include "message.h" #include "teatr.h" #include "bits/stdc++.h" using namespace std; //int GetN() { return int(1e8); } //int GetElement(int i) { return (i * 1ll * i) % int(1e6) + 1; } // Returns sum of arr[0..index]. This function assumes // that the array is preprocessed and partial sums of // array elements are stored in BITree[]. long getSum(long BITree[], long index) { long sum = 0; // Initialize result // Traverse ancestors of BITree[index] while (index > 0) { // Add current element of BITree to sum sum += BITree[index]; // Move index to parent node in getSum View index -= index & (-index); } return sum; } // Updates a node in Binary Index Tree (BITree) at given index // in BITree. The given value 'val' is added to BITree[i] and // all of its ancestors in tree. void updateBIT(long BITree[], long n, long index, long val) { // Traverse all ancestors and add 'val' while (index <= n) { // Add 'val' to current node of BI Tree BITree[index] += val; // Update index to that of parent in update View index += index & (-index); } } int main() { // if(MyNodeId() != 0) return 0; long n = GetN(); long long inversions = 0; long long hits = 0; long maxElement = 1000000; long minEl = MyNodeId() * 10000 + 1; long maxEl = (MyNodeId() + 1)*10000; long BIT[10000+2]; for (long i=1; i<=10001; i++) BIT[i] = 0; for(long i=0; i<n; i++) { long el = maxElement - GetElement(i); if (el > maxEl) { inversions += getSum(BIT, 10000); updateBIT(BIT, 10000, 10001, 1); } else if (el >= minEl && el <= maxEl) { inversions += getSum(BIT, el - minEl + 1 - 1); updateBIT(BIT, 10000, el - minEl + 1, 1); } } if (MyNodeId() > 0) { PutLL(0, inversions); Send(0); } else { for (long i = 1; i < NumberOfNodes(); ++i) { long instancja = Receive(-1); inversions += GetLL(instancja); } cout << inversions << endl; } return 0; } |
English