#include <bits/stdc++.h> #include "message.h" #include "teatr.h" using namespace std; const int M = 102; int ifroms[M]; int itos[M]; int vfroms[M]; int vtos[M]; int cells[M]; const int N = 1000005; int t[N]; int tot; int sum(int r) { int result = 0; for (; r >= 0; r = (r & (r+1)) - 1) { result += t[r]; } return result; } void inc(int i, int delta) { tot += delta; for (; i < N; i = (i | (i+1))) { t[i] += delta; } } void wipe() { tot = 0; memset(t, 0, sizeof(t)); } int cnt[N]; int field[M][M]; int main() { int nodes = NumberOfNodes(); int myNode = MyNodeId(); int n = GetN(); int imx = n; int vmx = 1000002; int isz = (n + nodes - 1) / nodes; int vsz = (vmx + nodes - 1) / nodes; for (int node = 0; node < nodes; node++) { vfroms[node] = node * vsz; ifroms[node] = node * isz; vtos[node] = min(vmx, vfroms[node] + vsz); itos[node] = min(imx, ifroms[node] + isz); } int ifrom = ifroms[myNode]; int vfrom = vfroms[myNode]; int ito = itos[myNode]; int vto = vtos[myNode]; long long res = 0; wipe(); for (int node = 0; node < nodes; node++) { int l = ifroms[node]; int r = itos[node]; int cell = 0; for (int i = l; i < r; i++) { int x = GetElement(i); if (x < vfrom) continue; if (x >= vto) continue; cnt[x]++; cell++; } cells[node] = cell; for (int v = vfrom; v < vto; v++) { res += 1LL * cnt[v] * (tot - sum(v)); } for (int v = vfrom; v < vto; v++) { inc(v, cnt[v]); cnt[v] = 0; } } for (int node = 0; node < nodes; node++) { PutInt(0, cells[node]); } Send(0); // cout << myNode << " " << ifrom << " " << ito << " " << vfrom << " " << vto << " " << res << endl; wipe(); for (int i = ifrom; i < ito; i++) { int x = GetElement(i); res += tot - sum(x); inc(x, 1); } PutLL(0, res); Send(0); if (myNode == 0) { long long ans = 0; for (int node = 0; node < nodes; node++) { Receive(node); for (int q = 0; q < nodes; q++) { field[node][q] = GetInt(node); } } for (int i1 = 0; i1 < nodes; i1++) { for (int j1 = 0; j1 < nodes; j1++) { int f1 = field[i1][j1]; for (int i2 = i1 - 1; i2 >= 0; i2--) { for (int j2 = j1 + 1; j2 < nodes; j2++) { ans += 1LL * f1 * field[i2][j2]; } } } } for (int node = 0; node < nodes; node++) { Receive(node); ans += GetLL(node); } cout << ans << 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 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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | #include <bits/stdc++.h> #include "message.h" #include "teatr.h" using namespace std; const int M = 102; int ifroms[M]; int itos[M]; int vfroms[M]; int vtos[M]; int cells[M]; const int N = 1000005; int t[N]; int tot; int sum(int r) { int result = 0; for (; r >= 0; r = (r & (r+1)) - 1) { result += t[r]; } return result; } void inc(int i, int delta) { tot += delta; for (; i < N; i = (i | (i+1))) { t[i] += delta; } } void wipe() { tot = 0; memset(t, 0, sizeof(t)); } int cnt[N]; int field[M][M]; int main() { int nodes = NumberOfNodes(); int myNode = MyNodeId(); int n = GetN(); int imx = n; int vmx = 1000002; int isz = (n + nodes - 1) / nodes; int vsz = (vmx + nodes - 1) / nodes; for (int node = 0; node < nodes; node++) { vfroms[node] = node * vsz; ifroms[node] = node * isz; vtos[node] = min(vmx, vfroms[node] + vsz); itos[node] = min(imx, ifroms[node] + isz); } int ifrom = ifroms[myNode]; int vfrom = vfroms[myNode]; int ito = itos[myNode]; int vto = vtos[myNode]; long long res = 0; wipe(); for (int node = 0; node < nodes; node++) { int l = ifroms[node]; int r = itos[node]; int cell = 0; for (int i = l; i < r; i++) { int x = GetElement(i); if (x < vfrom) continue; if (x >= vto) continue; cnt[x]++; cell++; } cells[node] = cell; for (int v = vfrom; v < vto; v++) { res += 1LL * cnt[v] * (tot - sum(v)); } for (int v = vfrom; v < vto; v++) { inc(v, cnt[v]); cnt[v] = 0; } } for (int node = 0; node < nodes; node++) { PutInt(0, cells[node]); } Send(0); // cout << myNode << " " << ifrom << " " << ito << " " << vfrom << " " << vto << " " << res << endl; wipe(); for (int i = ifrom; i < ito; i++) { int x = GetElement(i); res += tot - sum(x); inc(x, 1); } PutLL(0, res); Send(0); if (myNode == 0) { long long ans = 0; for (int node = 0; node < nodes; node++) { Receive(node); for (int q = 0; q < nodes; q++) { field[node][q] = GetInt(node); } } for (int i1 = 0; i1 < nodes; i1++) { for (int j1 = 0; j1 < nodes; j1++) { int f1 = field[i1][j1]; for (int i2 = i1 - 1; i2 >= 0; i2--) { for (int j2 = j1 + 1; j2 < nodes; j2++) { ans += 1LL * f1 * field[i2][j2]; } } } } for (int node = 0; node < nodes; node++) { Receive(node); ans += GetLL(node); } cout << ans << endl; } return 0; } |