#include <iostream> #include <vector> #include "teatr.h" #include <cmath> #include "message.h" using namespace std; using ll = long long; const int MAXN = 1e6 + 5; int cnt[MAXN], Tree[(1 << 20)], Base = (1 << 20); int f(int x) { return x & (-x); } void chTree(int node, int v) { while (node <= Base) { Tree[node] += v; node += f(node); } } int read(int node) { if (node < 0) return 0; int res = 0; while (node) { res += Tree[node]; node -= f(node); } return res; } ll solve(vector<int> &V) { ll res = 0; int n = V.size(); for (int i = 0; i < n; i++) { res += (i - read(V[i])); chTree(V[i], 1); } return res; } ll brute(int n) { vector<int> V; for (int i = 0; i < n; i++) { V.push_back(GetElement(i)); } return solve(V); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n = GetN(); int id = MyNodeId(); int ile = NumberOfNodes(); ile = min(ile, n); if (id >= ile) { return 0; } if (n <= 100000) { if (id > 0) { return 0; } cout << brute(n); return 0; } int m = (n + ile - 1) / ile; int a = id * m; int b = min(n - 1, (id + 1) * m - 1); for (int i = 0; i < a; i++) { cnt[GetElement(i)]++; } for (int i = 1; i < MAXN; i++) { cnt[i] += cnt[i - 1]; } ll res = 0; vector<int> V; for (int i = a; i <= b; i++) { int v = GetElement(i); V.push_back(v); res += (a - cnt[v]); } res += solve(V); //cout << res << "\n"; if (id) { PutLL(0, res); Send(0); return 0; } for (int i = 1; i < ile; i++) { Receive(i); res += GetLL(i); } 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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #include <iostream> #include <vector> #include "teatr.h" #include <cmath> #include "message.h" using namespace std; using ll = long long; const int MAXN = 1e6 + 5; int cnt[MAXN], Tree[(1 << 20)], Base = (1 << 20); int f(int x) { return x & (-x); } void chTree(int node, int v) { while (node <= Base) { Tree[node] += v; node += f(node); } } int read(int node) { if (node < 0) return 0; int res = 0; while (node) { res += Tree[node]; node -= f(node); } return res; } ll solve(vector<int> &V) { ll res = 0; int n = V.size(); for (int i = 0; i < n; i++) { res += (i - read(V[i])); chTree(V[i], 1); } return res; } ll brute(int n) { vector<int> V; for (int i = 0; i < n; i++) { V.push_back(GetElement(i)); } return solve(V); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n = GetN(); int id = MyNodeId(); int ile = NumberOfNodes(); ile = min(ile, n); if (id >= ile) { return 0; } if (n <= 100000) { if (id > 0) { return 0; } cout << brute(n); return 0; } int m = (n + ile - 1) / ile; int a = id * m; int b = min(n - 1, (id + 1) * m - 1); for (int i = 0; i < a; i++) { cnt[GetElement(i)]++; } for (int i = 1; i < MAXN; i++) { cnt[i] += cnt[i - 1]; } ll res = 0; vector<int> V; for (int i = a; i <= b; i++) { int v = GetElement(i); V.push_back(v); res += (a - cnt[v]); } res += solve(V); //cout << res << "\n"; if (id) { PutLL(0, res); Send(0); return 0; } for (int i = 1; i < ile; i++) { Receive(i); res += GetLL(i); } cout << res << "\n"; } |