#include <iostream>
#include <cmath>
#include "message.h"
#include "teatr.h"
using namespace std;
const int MAXN = 1e6 + 5;
const int MAXT = 1 << 20;
const int Base = 1 << 20;
long long T[2 * MAXT];
int tab[MAXN];
int suf[MAXN];
long long tree_query(int v, int lo, int hi, int l, int r) {
if (lo > r || hi < l) {
return 0;
}
if (lo >= l && hi <= r) {
return T[v];
}
int mid = (lo + hi) / 2;
return tree_query(2 * v, lo, mid, l, r) + tree_query(2 * v + 1, mid + 1, hi, l, r);
}
void update(int v, int x) {
v += Base;
T[v] = x;
v /= 2;
while (v) {
T[v] = T[2 * v] + T[2 * v + 1];
v /= 2;
}
}
int main() {
int n = GetN();
int m = NumberOfNodes();
int id = MyNodeId();
m = min(n, m);
if (id >= m) {
return 0;
}
int pocz = ceil(double(n) / m) * id;
int kon = min((int)ceil(double(n) / m) * (id + 1) - 1, n - 1);
int len = kon - pocz + 1;
for (int i = 0; i < pocz; i++) {
suf[GetElement(i)]++;
}
for (int i = pocz; i <= kon; i++) {
tab[i - pocz] = GetElement(i);
}
long long res = 0;
for (int i = 0; i < len; i++) {
res += tree_query(1, 0, Base - 1, tab[i], Base - 1);
update(tab[i] - 1, 1);
}
for (int i = MAXN - 1; i >= 0; i--) {
suf[i] += suf[i + 1];
}
for (int i = 0; i < len; i++) {
res += suf[tab[i] + 1];
}
if (id > 0) {
PutLL(0, res);
Send(0);
} else {
for (int instancja = 1; instancja < m; ++instancja) {
Receive(instancja);
res += GetLL(instancja);
}
cout << res << "\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 | #include <iostream> #include <cmath> #include "message.h" #include "teatr.h" using namespace std; const int MAXN = 1e6 + 5; const int MAXT = 1 << 20; const int Base = 1 << 20; long long T[2 * MAXT]; int tab[MAXN]; int suf[MAXN]; long long tree_query(int v, int lo, int hi, int l, int r) { if (lo > r || hi < l) { return 0; } if (lo >= l && hi <= r) { return T[v]; } int mid = (lo + hi) / 2; return tree_query(2 * v, lo, mid, l, r) + tree_query(2 * v + 1, mid + 1, hi, l, r); } void update(int v, int x) { v += Base; T[v] = x; v /= 2; while (v) { T[v] = T[2 * v] + T[2 * v + 1]; v /= 2; } } int main() { int n = GetN(); int m = NumberOfNodes(); int id = MyNodeId(); m = min(n, m); if (id >= m) { return 0; } int pocz = ceil(double(n) / m) * id; int kon = min((int)ceil(double(n) / m) * (id + 1) - 1, n - 1); int len = kon - pocz + 1; for (int i = 0; i < pocz; i++) { suf[GetElement(i)]++; } for (int i = pocz; i <= kon; i++) { tab[i - pocz] = GetElement(i); } long long res = 0; for (int i = 0; i < len; i++) { res += tree_query(1, 0, Base - 1, tab[i], Base - 1); update(tab[i] - 1, 1); } for (int i = MAXN - 1; i >= 0; i--) { suf[i] += suf[i + 1]; } for (int i = 0; i < len; i++) { res += suf[tab[i] + 1]; } if (id > 0) { PutLL(0, res); Send(0); } else { for (int instancja = 1; instancja < m; ++instancja) { Receive(instancja); res += GetLL(instancja); } cout << res << "\n"; } } |
English