#include <cstdio>
#include <queue>
#include "dzialka.h"
#include "message.h"
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define SIZE(c) ((int)(c).size())
typedef long long LL;
LL res[2][75001];
queue<LL> in, out;
int main() {
int n = GetFieldHeight(), m = GetFieldWidth();
int nodes = NumberOfNodes(), node = MyNodeId();
int a = m * node / nodes, b = m * (node + 1) / nodes;
LL r = 0;
REP(i,n) {
int ii = i & 1;
if (node) {
if (in.empty()) {
Receive(node - 1);
int size = GetInt(node - 1);
REP(s,size) in.push(GetLL(node - 1));
}
res[ii ^ 1][0] = in.front();
in.pop();
}
FOR(j,a,b) {
int jj = j - a;
if (IsUsableCell(i, j)) {
LL x = res[ii][jj + 1] + res[ii ^ 1][jj];
if (x) x -= res[ii][jj];
++x;
res[ii ^ 1][jj + 1] = x;
r += x;
} else
res[ii ^ 1][jj + 1] = 0;
}
if (node < nodes - 1) {
out.push(res[ii ^ 1][b - a]);
if (SIZE(out) == 76) {
PutInt(node + 1, SIZE(out));
while (!out.empty()) {
PutLL(node + 1, out.front());
out.pop();
}
Send(node + 1);
}
}
}
if (!out.empty()) {
PutInt(node + 1, SIZE(out));
while (!out.empty()) {
PutLL(node + 1, out.front());
out.pop();
}
Send(node + 1);
}
if (node) {
Receive(node - 1);
r += GetLL(node - 1);
}
if (node < nodes - 1) {
PutLL(node + 1, r);
Send(node + 1);
} else printf("%lld\n", r);
}
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 | #include <cstdio> #include <queue> #include "dzialka.h" #include "message.h" using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define REP(i,n) FOR(i,0,n) #define SIZE(c) ((int)(c).size()) typedef long long LL; LL res[2][75001]; queue<LL> in, out; int main() { int n = GetFieldHeight(), m = GetFieldWidth(); int nodes = NumberOfNodes(), node = MyNodeId(); int a = m * node / nodes, b = m * (node + 1) / nodes; LL r = 0; REP(i,n) { int ii = i & 1; if (node) { if (in.empty()) { Receive(node - 1); int size = GetInt(node - 1); REP(s,size) in.push(GetLL(node - 1)); } res[ii ^ 1][0] = in.front(); in.pop(); } FOR(j,a,b) { int jj = j - a; if (IsUsableCell(i, j)) { LL x = res[ii][jj + 1] + res[ii ^ 1][jj]; if (x) x -= res[ii][jj]; ++x; res[ii ^ 1][jj + 1] = x; r += x; } else res[ii ^ 1][jj + 1] = 0; } if (node < nodes - 1) { out.push(res[ii ^ 1][b - a]); if (SIZE(out) == 76) { PutInt(node + 1, SIZE(out)); while (!out.empty()) { PutLL(node + 1, out.front()); out.pop(); } Send(node + 1); } } } if (!out.empty()) { PutInt(node + 1, SIZE(out)); while (!out.empty()) { PutLL(node + 1, out.front()); out.pop(); } Send(node + 1); } if (node) { Receive(node - 1); r += GetLL(node - 1); } if (node < nodes - 1) { PutLL(node + 1, r); Send(node + 1); } else printf("%lld\n", r); } |
English