#include <cstdlib>
#include <algorithm>
#include <vector>
#include "krazki.h"
#include "message.h"
int main() {
    int n = PipeHeight();
    int m = NumberOfDiscs();
    std::vector<unsigned long long> hole_diamaters(n + 2, 0);
    hole_diamaters[n + 1] = (unsigned long long) -1;
    int top = 0;
    int segment_size = m/NumberOfNodes() + 1;
    int start = MyNodeId()*segment_size + 1;
    int end = MyNodeId()*segment_size + segment_size;
    if (end > m) {
        end = m;
    }
    int local_below = 0;
    int local_highest_floor = start > end ? 0 : 1;
    int local_above = end - start;
    for (int i = 1; i <= n; ++i) {
        unsigned long long r = HoleDiameter(i);
        if (r <= hole_diamaters[-i + n + 2]) {
            hole_diamaters[-i + n + 1] = r;
        } else {
            hole_diamaters[-i + n + 1] = hole_diamaters[-i + n + 2];
        }
    }
    for (int i = start; i <= end; ++i) {
        std::vector<unsigned long long>::iterator where = std::upper_bound(
            hole_diamaters.begin() + top + 1,
            hole_diamaters.end(),
            DiscDiameter(i) - 1
        );
        int candidate = int(where - hole_diamaters.begin());
        if (candidate - top > 1) {
            local_below = i - start;
            local_highest_floor = candidate;
            local_above = end - i;
        }
        top = candidate;
    }
    if (MyNodeId() != 0) {
        PutInt(0, local_below);
        PutInt(0, local_highest_floor);
        PutInt(0, local_above);
        Send(0);
    } else {
        for (int i = 1; i < NumberOfNodes(); ++i) {
            Receive(i);
            int below = GetInt(i);
            int highest_floor = GetInt(i);
            int above = GetInt(i);
            // printf("%d %d %d \n", below, highest_floor, top);
            if (highest_floor) {
                if (highest_floor <= top) {
                    top = top + below + above + 1;
                } else {
                    if (highest_floor - top - 1 >= below) {
                        top = highest_floor + above;
                    } else {
                        top = top + below + above - (highest_floor - top - 1) + 1;
                    }
                }
            }
        }
        printf("%d\n", top < n ? n - top + 1 : 0);
    }
    return EXIT_SUCCESS;
}
        | 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 | #include <cstdlib> #include <algorithm> #include <vector> #include "krazki.h" #include "message.h" int main() { int n = PipeHeight(); int m = NumberOfDiscs(); std::vector<unsigned long long> hole_diamaters(n + 2, 0); hole_diamaters[n + 1] = (unsigned long long) -1; int top = 0; int segment_size = m/NumberOfNodes() + 1; int start = MyNodeId()*segment_size + 1; int end = MyNodeId()*segment_size + segment_size; if (end > m) { end = m; } int local_below = 0; int local_highest_floor = start > end ? 0 : 1; int local_above = end - start; for (int i = 1; i <= n; ++i) { unsigned long long r = HoleDiameter(i); if (r <= hole_diamaters[-i + n + 2]) { hole_diamaters[-i + n + 1] = r; } else { hole_diamaters[-i + n + 1] = hole_diamaters[-i + n + 2]; } } for (int i = start; i <= end; ++i) { std::vector<unsigned long long>::iterator where = std::upper_bound( hole_diamaters.begin() + top + 1, hole_diamaters.end(), DiscDiameter(i) - 1 ); int candidate = int(where - hole_diamaters.begin()); if (candidate - top > 1) { local_below = i - start; local_highest_floor = candidate; local_above = end - i; } top = candidate; } if (MyNodeId() != 0) { PutInt(0, local_below); PutInt(0, local_highest_floor); PutInt(0, local_above); Send(0); } else { for (int i = 1; i < NumberOfNodes(); ++i) { Receive(i); int below = GetInt(i); int highest_floor = GetInt(i); int above = GetInt(i); // printf("%d %d %d \n", below, highest_floor, top); if (highest_floor) { if (highest_floor <= top) { top = top + below + above + 1; } else { if (highest_floor - top - 1 >= below) { top = highest_floor + above; } else { top = top + below + above - (highest_floor - top - 1) + 1; } } } } printf("%d\n", top < n ? n - top + 1 : 0); } return EXIT_SUCCESS; } | 
 
            
         English
                    English