#include <iostream>
#include <algorithm>
#include "krazki.h"
#include "message.h"
using namespace std;
struct dysk
{
int nr;
long long r;
long long deep;
};
long long abc = 0;
int n, m;
int f;
dysk disc[10000000];
long long wynik;
bool cmp_1(dysk x, dysk y)
{
if(x.r > y.r)
return true;
else
return false;
}
bool cmp_2(dysk x, dysk y)
{
if(x.nr < y.nr)
return true;
else
return false;
}
void sito()
{
long long sher = 2000000000000000000;
long long iter = 0;
for(int i=1; i<=n; i++)
{
sher = min(sher,HoleDiameter(i));
if(disc[iter].r > sher)
{
disc[iter].deep = i-1;
iter++;
}
}
if(disc[iter].r <= sher)
disc[iter].deep = n;
}
int main()
{
int j=0;
n = PipeHeight();
m = NumberOfDiscs();
if(NumberOfNodes() <= m)
{
if(MyNodeId() == NumberOfNodes()-1)
f = m;
else
f = ((MyNodeId()+1)*(m/NumberOfNodes()));
for(long long i=1+(MyNodeId()*(m/NumberOfNodes())); i<=f; i++)
{
disc[j].r = DiscDiameter(i);
disc[j].nr = j;
j++;
}
}
else
{
for(long long i=1; i<=m; i++)
{
disc[j].r = DiscDiameter(i);
disc[j].nr = j;
j++;
}
}
sort(disc, disc+j, cmp_1);
sito();
sort(disc, disc+j, cmp_2);
for(int i=1; i<j; i++)
disc[i].deep = max(min(disc[i-1].deep-1,disc[i].deep),abc);
wynik = disc[j-1].deep;
if(NumberOfNodes() <= m)
{
if(MyNodeId() == 0)
{
for(int instance = 1; instance < NumberOfNodes(); instance++)
{
PutLL(instance,wynik);
Send(instance);
Receive(instance);
wynik = GetLL(instance);
}
cout<<wynik;
}
else
{
Receive(0);
wynik = GetLL(0);
for(int i=0; i<j; i++)
wynik = max(min(disc[i].deep,wynik-1),abc);
PutLL(0,wynik);
Send(0);
}
}
else
{
if(MyNodeId() == 0)
cout<<wynik;
}
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 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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #include <iostream> #include <algorithm> #include "krazki.h" #include "message.h" using namespace std; struct dysk { int nr; long long r; long long deep; }; long long abc = 0; int n, m; int f; dysk disc[10000000]; long long wynik; bool cmp_1(dysk x, dysk y) { if(x.r > y.r) return true; else return false; } bool cmp_2(dysk x, dysk y) { if(x.nr < y.nr) return true; else return false; } void sito() { long long sher = 2000000000000000000; long long iter = 0; for(int i=1; i<=n; i++) { sher = min(sher,HoleDiameter(i)); if(disc[iter].r > sher) { disc[iter].deep = i-1; iter++; } } if(disc[iter].r <= sher) disc[iter].deep = n; } int main() { int j=0; n = PipeHeight(); m = NumberOfDiscs(); if(NumberOfNodes() <= m) { if(MyNodeId() == NumberOfNodes()-1) f = m; else f = ((MyNodeId()+1)*(m/NumberOfNodes())); for(long long i=1+(MyNodeId()*(m/NumberOfNodes())); i<=f; i++) { disc[j].r = DiscDiameter(i); disc[j].nr = j; j++; } } else { for(long long i=1; i<=m; i++) { disc[j].r = DiscDiameter(i); disc[j].nr = j; j++; } } sort(disc, disc+j, cmp_1); sito(); sort(disc, disc+j, cmp_2); for(int i=1; i<j; i++) disc[i].deep = max(min(disc[i-1].deep-1,disc[i].deep),abc); wynik = disc[j-1].deep; if(NumberOfNodes() <= m) { if(MyNodeId() == 0) { for(int instance = 1; instance < NumberOfNodes(); instance++) { PutLL(instance,wynik); Send(instance); Receive(instance); wynik = GetLL(instance); } cout<<wynik; } else { Receive(0); wynik = GetLL(0); for(int i=0; i<j; i++) wynik = max(min(disc[i].deep,wynik-1),abc); PutLL(0,wynik); Send(0); } } else { if(MyNodeId() == 0) cout<<wynik; } return 0; } |
English