// Jedna instancja wypisuje maksymalny wzrost. #include "message.h" #include "teatr.h" #include "bits/stdc++.h" #define MAXK 6 using namespace std; int main() { int n = GetN(); int ilosc_instancji = NumberOfNodes(); int moj_numer = MyNodeId(); bool jestem_pierwszy = (moj_numer == 0); bool jestem_ostatni = (moj_numer == (ilosc_instancji - 1)); int rozmiar_bloku = n / ilosc_instancji; int moja_pierwsza_pozycja = rozmiar_bloku * moj_numer; int moja_ostatnia_pozycja; if(!jestem_ostatni) { moja_ostatnia_pozycja = (rozmiar_bloku * (moj_numer + 1) - 1); } else { moja_ostatnia_pozycja = (n - 1); } int ile_wystapien_danego_elementu[MAXK]; int ile_wystapien_danego_elementu_z_lewej[MAXK]; int ile_wystapien_danego_elementu_sumarycznie[MAXK]; for(int i = 1; i < MAXK; i++) { ile_wystapien_danego_elementu[i] = 0; ile_wystapien_danego_elementu_z_lewej[i] = 0; ile_wystapien_danego_elementu_sumarycznie[i] = 0; } for(int i = moja_pierwsza_pozycja; i <= moja_ostatnia_pozycja; i++) { ile_wystapien_danego_elementu[GetElement(i)]++; } for(int i = 1; i < MAXK; i++) { ile_wystapien_danego_elementu_sumarycznie[i] = ile_wystapien_danego_elementu[i]; } if(!jestem_pierwszy) { Receive(moj_numer - 1); for(int i = 1; i < MAXK; i++) { ile_wystapien_danego_elementu_z_lewej[i] = GetInt(moj_numer - 1); } for(int i = 1; i < MAXK; i++) { ile_wystapien_danego_elementu_sumarycznie[i] += ile_wystapien_danego_elementu_z_lewej[i]; } } if(!jestem_ostatni) { for(int i = 1; i < MAXK; i++) { PutInt(moj_numer + 1, ile_wystapien_danego_elementu_sumarycznie[i]); } Send(moj_numer + 1); } for(int i = 1; i < MAXK; i++) { ile_wystapien_danego_elementu[i] = ile_wystapien_danego_elementu_z_lewej[i]; } long long ile_klotni_ode_mnie = 0; int elem; for(int i = moja_pierwsza_pozycja; i <= moja_ostatnia_pozycja; i++) { elem = GetElement(i); for(int j = elem + 1; j < MAXK; j++) { ile_klotni_ode_mnie += ile_wystapien_danego_elementu[j]; } ile_wystapien_danego_elementu[elem]++; } if(!jestem_ostatni) { Receive(moj_numer + 1); ile_klotni_ode_mnie += GetLL(moj_numer + 1); } if(!jestem_pierwszy) { PutLL(moj_numer - 1, ile_klotni_ode_mnie); Send(moj_numer - 1); } if(moj_numer == 0) { cout << ile_klotni_ode_mnie << endl; } }
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 | // Jedna instancja wypisuje maksymalny wzrost. #include "message.h" #include "teatr.h" #include "bits/stdc++.h" #define MAXK 6 using namespace std; int main() { int n = GetN(); int ilosc_instancji = NumberOfNodes(); int moj_numer = MyNodeId(); bool jestem_pierwszy = (moj_numer == 0); bool jestem_ostatni = (moj_numer == (ilosc_instancji - 1)); int rozmiar_bloku = n / ilosc_instancji; int moja_pierwsza_pozycja = rozmiar_bloku * moj_numer; int moja_ostatnia_pozycja; if(!jestem_ostatni) { moja_ostatnia_pozycja = (rozmiar_bloku * (moj_numer + 1) - 1); } else { moja_ostatnia_pozycja = (n - 1); } int ile_wystapien_danego_elementu[MAXK]; int ile_wystapien_danego_elementu_z_lewej[MAXK]; int ile_wystapien_danego_elementu_sumarycznie[MAXK]; for(int i = 1; i < MAXK; i++) { ile_wystapien_danego_elementu[i] = 0; ile_wystapien_danego_elementu_z_lewej[i] = 0; ile_wystapien_danego_elementu_sumarycznie[i] = 0; } for(int i = moja_pierwsza_pozycja; i <= moja_ostatnia_pozycja; i++) { ile_wystapien_danego_elementu[GetElement(i)]++; } for(int i = 1; i < MAXK; i++) { ile_wystapien_danego_elementu_sumarycznie[i] = ile_wystapien_danego_elementu[i]; } if(!jestem_pierwszy) { Receive(moj_numer - 1); for(int i = 1; i < MAXK; i++) { ile_wystapien_danego_elementu_z_lewej[i] = GetInt(moj_numer - 1); } for(int i = 1; i < MAXK; i++) { ile_wystapien_danego_elementu_sumarycznie[i] += ile_wystapien_danego_elementu_z_lewej[i]; } } if(!jestem_ostatni) { for(int i = 1; i < MAXK; i++) { PutInt(moj_numer + 1, ile_wystapien_danego_elementu_sumarycznie[i]); } Send(moj_numer + 1); } for(int i = 1; i < MAXK; i++) { ile_wystapien_danego_elementu[i] = ile_wystapien_danego_elementu_z_lewej[i]; } long long ile_klotni_ode_mnie = 0; int elem; for(int i = moja_pierwsza_pozycja; i <= moja_ostatnia_pozycja; i++) { elem = GetElement(i); for(int j = elem + 1; j < MAXK; j++) { ile_klotni_ode_mnie += ile_wystapien_danego_elementu[j]; } ile_wystapien_danego_elementu[elem]++; } if(!jestem_ostatni) { Receive(moj_numer + 1); ile_klotni_ode_mnie += GetLL(moj_numer + 1); } if(!jestem_pierwszy) { PutLL(moj_numer - 1, ile_klotni_ode_mnie); Send(moj_numer - 1); } if(moj_numer == 0) { cout << ile_klotni_ode_mnie << endl; } } |