#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"; } } |