#include <iostream>
#include <vector>
#include <cmath>
#include "teatr.h"
#include "message.h"
using namespace std;
typedef unsigned long long ull;
int main() {
const int NODE_ID = MyNodeId();
const int NODE_SIZE = 1000000;
const int N = GetN();
const int NODES = (int) ceil((float) N / (float) NODE_SIZE);
if (NODE_ID * NODE_SIZE > N) {
return 0;
}
const int OFFSET = NODE_ID * NODE_SIZE;
int size = NODES == 1 ? N : NODE_ID < NODES - 1 ? NODE_SIZE : N - OFFSET;
vector<int> heights;
heights.reserve(size);
for (int i = 0; i < size; i++) {
int height = GetElement(OFFSET + i);
heights.push_back(height);
}
vector<int> buckets = {0, 0, 0, 0, 0, 0};
ull result = 0;
for (int height : heights) {
buckets[height]++;
for (int i = height + 1; i < buckets.size(); i++) {
result += buckets[i];
}
}
if (NODES == 1) {
cout << result << endl;
return 0;
}
for (int i = NODE_ID + 1; i < NODES; i++) {
for (int bucket : buckets) {
PutInt(i, bucket);
}
Send(i);
}
for (int i = 0; i < NODE_ID; i++) {
vector<int> buckets2;
Receive(i);
for (int j = 0; j < 6; j++) {
buckets2.push_back(GetInt(i));
}
for (int i = 0; i < 6; i++) {
for (int j = i + 1; j < 6; j++) {
result += buckets[i] * buckets2[j];
}
}
}
if (NODE_ID != 0) {
PutLL(0, result);
Send(0);
} else {
for (int i = 1; i < NODES; i++) {
Receive(i);
result += GetLL(i);
}
cout << result << 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 | #include <iostream> #include <vector> #include <cmath> #include "teatr.h" #include "message.h" using namespace std; typedef unsigned long long ull; int main() { const int NODE_ID = MyNodeId(); const int NODE_SIZE = 1000000; const int N = GetN(); const int NODES = (int) ceil((float) N / (float) NODE_SIZE); if (NODE_ID * NODE_SIZE > N) { return 0; } const int OFFSET = NODE_ID * NODE_SIZE; int size = NODES == 1 ? N : NODE_ID < NODES - 1 ? NODE_SIZE : N - OFFSET; vector<int> heights; heights.reserve(size); for (int i = 0; i < size; i++) { int height = GetElement(OFFSET + i); heights.push_back(height); } vector<int> buckets = {0, 0, 0, 0, 0, 0}; ull result = 0; for (int height : heights) { buckets[height]++; for (int i = height + 1; i < buckets.size(); i++) { result += buckets[i]; } } if (NODES == 1) { cout << result << endl; return 0; } for (int i = NODE_ID + 1; i < NODES; i++) { for (int bucket : buckets) { PutInt(i, bucket); } Send(i); } for (int i = 0; i < NODE_ID; i++) { vector<int> buckets2; Receive(i); for (int j = 0; j < 6; j++) { buckets2.push_back(GetInt(i)); } for (int i = 0; i < 6; i++) { for (int j = i + 1; j < 6; j++) { result += buckets[i] * buckets2[j]; } } } if (NODE_ID != 0) { PutLL(0, result); Send(0); } else { for (int i = 1; i < NODES; i++) { Receive(i); result += GetLL(i); } cout << result << endl; } return 0; } |
English