#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include "teatr.h"
#include "message.h"
int get_start(int N, int nodes, int node_id) {
int segment_size = N/nodes;
return node_id * segment_size;
}
int get_end(int N, int nodes, int node_id) {
if (node_id == nodes - 1) {
return N;
}
int segment_size = N/nodes;
return node_id * segment_size + segment_size;
}
int main() {
int N = GetN();
int nodes = NumberOfNodes();
int node_id = MyNodeId();
int counts[6] = {0, 0, 0, 0, 0, 0};
long long result = 0;
// printf("%d %d %d\n", node_id, get_start(N, nodes, node_id), get_end(N, nodes, node_id));
for (int i = get_start(N, nodes, node_id); i < get_end(N, nodes, node_id); i++) {
int height = GetElement(i);
counts[height]++;
for (int j = height + 1; j < 6; j++) {
result += counts[j];
}
// for (int j = 0; j < 6; j++) {
// printf("%d ", counts[j]);
// }
// puts("");
}
if (node_id < nodes - 1) {
int receive_from = node_id + 1;
int counts_temp[6];
Receive(receive_from);
for (int i = 0; i < 6; i++) {
int taller_counts_sum = 0;
counts_temp[i] = GetInt(receive_from);
for (int j = 5; j > i; j--) {
taller_counts_sum += counts[j];
}
result += counts_temp[i] * taller_counts_sum;
}
for (int i = 0; i < 6; i++) {
counts[i] += counts_temp[i];
}
result += GetLL(receive_from);
}
// printf("%d %lld\n", node_id, result);
// for (int j = 0; j < 6; j++) {
// printf("%d ", counts[j]);
// }
// puts("");
if (node_id > 0) {
for (int i = 0; i < 6; i++) {
PutInt(node_id - 1, counts[i]);
}
PutLL(node_id - 1, result);
Send(node_id - 1);
}
if (node_id == 0) {
printf("%lld\n", result);
}
}
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 | #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include "teatr.h" #include "message.h" int get_start(int N, int nodes, int node_id) { int segment_size = N/nodes; return node_id * segment_size; } int get_end(int N, int nodes, int node_id) { if (node_id == nodes - 1) { return N; } int segment_size = N/nodes; return node_id * segment_size + segment_size; } int main() { int N = GetN(); int nodes = NumberOfNodes(); int node_id = MyNodeId(); int counts[6] = {0, 0, 0, 0, 0, 0}; long long result = 0; // printf("%d %d %d\n", node_id, get_start(N, nodes, node_id), get_end(N, nodes, node_id)); for (int i = get_start(N, nodes, node_id); i < get_end(N, nodes, node_id); i++) { int height = GetElement(i); counts[height]++; for (int j = height + 1; j < 6; j++) { result += counts[j]; } // for (int j = 0; j < 6; j++) { // printf("%d ", counts[j]); // } // puts(""); } if (node_id < nodes - 1) { int receive_from = node_id + 1; int counts_temp[6]; Receive(receive_from); for (int i = 0; i < 6; i++) { int taller_counts_sum = 0; counts_temp[i] = GetInt(receive_from); for (int j = 5; j > i; j--) { taller_counts_sum += counts[j]; } result += counts_temp[i] * taller_counts_sum; } for (int i = 0; i < 6; i++) { counts[i] += counts_temp[i]; } result += GetLL(receive_from); } // printf("%d %lld\n", node_id, result); // for (int j = 0; j < 6; j++) { // printf("%d ", counts[j]); // } // puts(""); if (node_id > 0) { for (int i = 0; i < 6; i++) { PutInt(node_id - 1, counts[i]); } PutLL(node_id - 1, result); Send(node_id - 1); } if (node_id == 0) { printf("%lld\n", result); } } |
English