#include <algorithm> #include <cstdio> #include <vector> #include "message.h" #include "krazki.h" #define ODPOWIADAJACY 0 int binsearch_po_wyniku(const std::vector<long long> &tbl, long long srednicaKrazka) { int a = -1; int z = tbl.size(); while (a+1 != z) { int s = (a+z)/2; long long szerokoscDziury = HoleDiameter(tbl[s]); if (szerokoscDziury < srednicaKrazka) { a = s; } else if (srednicaKrazka <= szerokoscDziury) { z = s; } } return ((a==-1)? -1: a); } struct { bool operator () (const int a, const int b) const { if (HoleDiameter(a) < HoleDiameter(a)) { return true; } else if (a < b) { return true; } } }porownanieDziur; int main() { int ja = MyNodeId(); int uruchomien = NumberOfNodes(); int glebokosc_rury = PipeHeight(); int krazkow = NumberOfDiscs(); int od = 1 + ja * (glebokosc_rury/uruchomien) + std::min(ja, glebokosc_rury%uruchomien); int po = od + (glebokosc_rury/uruchomien) - 1 + ((ja+1) <= glebokosc_rury%uruchomien); int najzawczesniej = 0; if (od <= po) { std::vector<long long> dziury(std::max(0,po-od+1)); // fprintf(stderr, "%d-%d\n", od, po); for(int i=0; i <= od-po; ++i) { dziury[i] = od+i; } std::sort(dziury.begin(), dziury.end(), porownanieDziur); for (int i=1;i<=krazkow;++i) { int znajda = binsearch_po_wyniku(dziury, DiscDiameter(i)); if (znajda == -1) { continue; } int zawczesnie = (glebokosc_rury-i+1) - (dziury[znajda] - 1); if (najzawczesniej < zawczesnie) { najzawczesniej = zawczesnie; } } } if (ja != ODPOWIADAJACY) { PutInt(ODPOWIADAJACY, najzawczesniej); Send(ODPOWIADAJACY); // fprintf(stderr, "%d\n", najzawczesniej); } else { // fprintf(stderr, "%d\n", najzawczesniej); for (int i=1; i < uruchomien; ++i) { int nadawca = Receive(-1); int zawczesnie = GetInt(nadawca); if (najzawczesniej < zawczesnie) { najzawczesniej = zawczesnie; } } printf("%d\n", std::max(0, ((glebokosc_rury-krazkow+1) - najzawczesniej))); } }
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 | #include <algorithm> #include <cstdio> #include <vector> #include "message.h" #include "krazki.h" #define ODPOWIADAJACY 0 int binsearch_po_wyniku(const std::vector<long long> &tbl, long long srednicaKrazka) { int a = -1; int z = tbl.size(); while (a+1 != z) { int s = (a+z)/2; long long szerokoscDziury = HoleDiameter(tbl[s]); if (szerokoscDziury < srednicaKrazka) { a = s; } else if (srednicaKrazka <= szerokoscDziury) { z = s; } } return ((a==-1)? -1: a); } struct { bool operator () (const int a, const int b) const { if (HoleDiameter(a) < HoleDiameter(a)) { return true; } else if (a < b) { return true; } } }porownanieDziur; int main() { int ja = MyNodeId(); int uruchomien = NumberOfNodes(); int glebokosc_rury = PipeHeight(); int krazkow = NumberOfDiscs(); int od = 1 + ja * (glebokosc_rury/uruchomien) + std::min(ja, glebokosc_rury%uruchomien); int po = od + (glebokosc_rury/uruchomien) - 1 + ((ja+1) <= glebokosc_rury%uruchomien); int najzawczesniej = 0; if (od <= po) { std::vector<long long> dziury(std::max(0,po-od+1)); // fprintf(stderr, "%d-%d\n", od, po); for(int i=0; i <= od-po; ++i) { dziury[i] = od+i; } std::sort(dziury.begin(), dziury.end(), porownanieDziur); for (int i=1;i<=krazkow;++i) { int znajda = binsearch_po_wyniku(dziury, DiscDiameter(i)); if (znajda == -1) { continue; } int zawczesnie = (glebokosc_rury-i+1) - (dziury[znajda] - 1); if (najzawczesniej < zawczesnie) { najzawczesniej = zawczesnie; } } } if (ja != ODPOWIADAJACY) { PutInt(ODPOWIADAJACY, najzawczesniej); Send(ODPOWIADAJACY); // fprintf(stderr, "%d\n", najzawczesniej); } else { // fprintf(stderr, "%d\n", najzawczesniej); for (int i=1; i < uruchomien; ++i) { int nadawca = Receive(-1); int zawczesnie = GetInt(nadawca); if (najzawczesniej < zawczesnie) { najzawczesniej = zawczesnie; } } printf("%d\n", std::max(0, ((glebokosc_rury-krazkow+1) - najzawczesniej))); } } |