#include "message.h"
#include "teatr.h"
#include "bits/stdc++.h"
using namespace std;
const int M = 1000000;
const int size = 1<<21;
const int mod = 1<<20;
struct IntTree{
vector<long long> tab;
vector<int> left;
vector<int> right;
IntTree(vector<long long>& init){
tab = vector<long long>(size, 0);
left = vector<int>(size, 0);
right = vector<int>(size, 0);
for(int i = 0; i < (int)init.size(); i++){
tab[mod + i] = init[i];
}
for(int i = 0; i < mod; i++){
left[mod + i] = i;
right[mod + i] = i;
}
for(int i = mod-1; i >= 1; i--){
tab[i] = tab[i*2] + tab[i*2+1];
left[i] = left[i*2];
right[i] = right[i*2+1];
}
}
void add(int where, long long val){
int act = where + mod;
while(act >= 1){
tab[act] += val;
act /= 2;
}
}
long long get_sum(int beg, int end, int node){
if(beg > right[node]) return 0;
if(end < left[node]) return 0;
if(left[node] >= beg && right[node] <= end) return tab[node];
return get_sum(beg, end, 2*node) + get_sum(beg, end, 2*node + 1);
}
};
int main() {
int n = GetN();
int number_of_nodes = NumberOfNodes();
int size_of_interval = n/number_of_nodes;
int my_node = MyNodeId();
int beg = my_node * size_of_interval;
int end = (my_node + 1) * size_of_interval;
if(my_node == number_of_nodes-1){
end = n;
}
vector<int> tab(M+1,0);
for(int i = end; i < n; i++){
tab[GetElement(i)]++;
}
vector<long long> amount_infront(M+1, 0);
for(int i = 0; i <= M; i++){
amount_infront[i] = tab[i];
}
long long result = 0;
IntTree t = IntTree(amount_infront);
for(int i = end - 1; i >= beg; i--){
int x = GetElement(i);
long long x_inverses = t.get_sum(0, x-1, 1);
result += x_inverses;
t.add(x, 1);
}
if(my_node > 0){
PutLL(0, result);
Send(0);
}
if(my_node == 0){
for(int i = 1; i < number_of_nodes; i++){
Receive(i);
result += GetLL(i);
}
cout<<result<<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; const int M = 1000000; const int size = 1<<21; const int mod = 1<<20; struct IntTree{ vector<long long> tab; vector<int> left; vector<int> right; IntTree(vector<long long>& init){ tab = vector<long long>(size, 0); left = vector<int>(size, 0); right = vector<int>(size, 0); for(int i = 0; i < (int)init.size(); i++){ tab[mod + i] = init[i]; } for(int i = 0; i < mod; i++){ left[mod + i] = i; right[mod + i] = i; } for(int i = mod-1; i >= 1; i--){ tab[i] = tab[i*2] + tab[i*2+1]; left[i] = left[i*2]; right[i] = right[i*2+1]; } } void add(int where, long long val){ int act = where + mod; while(act >= 1){ tab[act] += val; act /= 2; } } long long get_sum(int beg, int end, int node){ if(beg > right[node]) return 0; if(end < left[node]) return 0; if(left[node] >= beg && right[node] <= end) return tab[node]; return get_sum(beg, end, 2*node) + get_sum(beg, end, 2*node + 1); } }; int main() { int n = GetN(); int number_of_nodes = NumberOfNodes(); int size_of_interval = n/number_of_nodes; int my_node = MyNodeId(); int beg = my_node * size_of_interval; int end = (my_node + 1) * size_of_interval; if(my_node == number_of_nodes-1){ end = n; } vector<int> tab(M+1,0); for(int i = end; i < n; i++){ tab[GetElement(i)]++; } vector<long long> amount_infront(M+1, 0); for(int i = 0; i <= M; i++){ amount_infront[i] = tab[i]; } long long result = 0; IntTree t = IntTree(amount_infront); for(int i = end - 1; i >= beg; i--){ int x = GetElement(i); long long x_inverses = t.get_sum(0, x-1, 1); result += x_inverses; t.add(x, 1); } if(my_node > 0){ PutLL(0, result); Send(0); } if(my_node == 0){ for(int i = 1; i < number_of_nodes; i++){ Receive(i); result += GetLL(i); } cout<<result<<endl; } return 0; } |
English