// 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; } } |
English