#include "krazki.h"
#include "message.h"
#include <cstdio>
#include <algorithm>
typedef long long i64;
const int N = 3000000 + 10;
const i64 INF = 1LL << 62;
i64 a[N];
int main() {
const int n = PipeHeight(), m = NumberOfDiscs(), id = MyNodeId(), tot = NumberOfNodes(), size = (n + tot - 1) / tot;
const int l = id * size + 1, r = std::min((id + 1) * size, n);
if (l > n) return 0;
const int cnt = r - l;
for (int i = 0; i <= cnt; ++i) a[i] = HoleDiameter(i + l);
i64 cur = *std::min_element(a, a + cnt + 1), pre = INF;
if (id) {
Receive(id - 1);
pre = GetLL(id - 1);
}
if (r < n) {
PutLL(id + 1, std::min(cur, pre));
Send(id + 1);
}
a[0] = std::min(a[0], pre);
for (int i = 1; i <= cnt; ++i) a[i] = std::min(a[i - 1], a[i]);
int p = 1;
if (r < n) {
Receive(id + 1);
p = GetInt(id + 1);
}
int q = cnt;
while (p <= m) {
i64 t = DiscDiameter(p);
while (q >= 0 && a[q] < t) --q;
if (q < 0) break;
if (p++ == m) {
printf("%d\n", l + q);
break;
}
--q;
}
if (id) {
PutInt(id - 1, p);
Send(id - 1);
} else if (p <= m) {
puts("0");
}
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 | #include "krazki.h" #include "message.h" #include <cstdio> #include <algorithm> typedef long long i64; const int N = 3000000 + 10; const i64 INF = 1LL << 62; i64 a[N]; int main() { const int n = PipeHeight(), m = NumberOfDiscs(), id = MyNodeId(), tot = NumberOfNodes(), size = (n + tot - 1) / tot; const int l = id * size + 1, r = std::min((id + 1) * size, n); if (l > n) return 0; const int cnt = r - l; for (int i = 0; i <= cnt; ++i) a[i] = HoleDiameter(i + l); i64 cur = *std::min_element(a, a + cnt + 1), pre = INF; if (id) { Receive(id - 1); pre = GetLL(id - 1); } if (r < n) { PutLL(id + 1, std::min(cur, pre)); Send(id + 1); } a[0] = std::min(a[0], pre); for (int i = 1; i <= cnt; ++i) a[i] = std::min(a[i - 1], a[i]); int p = 1; if (r < n) { Receive(id + 1); p = GetInt(id + 1); } int q = cnt; while (p <= m) { i64 t = DiscDiameter(p); while (q >= 0 && a[q] < t) --q; if (q < 0) break; if (p++ == m) { printf("%d\n", l + q); break; } --q; } if (id) { PutInt(id - 1, p); Send(id - 1); } else if (p <= m) { puts("0"); } return 0; } |
English