#include<iostream>
#include<vector>
#include"kollib.h"
#include"message.h"
//Message
/*
int NumberOfNodes() {return 1;}
int MyNodeId() {return 0;}
void PutInt(int target, int value) {}
void Send(int target) {}
int Receive(int source) {return source;}
int GetInt(int source) {return -1;}
*/
using namespace std;
long mojKomputer;
long studentow;
long wyniki[200];
long zwroconychWynikow = 0;
void ZwrocWynik(long zadanie, long wynik) {
if(wynik > studentow / 2)
wynik = studentow - wynik;
if(mojKomputer == 0) {
wyniki[zadanie] = wynik;
++zwroconychWynikow;
} else {
PutInt(0, zadanie);
PutInt(0, wynik);
}
}
struct tZapytania {
long id, from, to, wynik;
char stan; //0; P; K; R=PK; L=KP
tZapytania(long _i, long _f, long _t) : id(_i), from(_f), to(_t), wynik(0), stan('0') {};
};
int main() {
ios_base::sync_with_stdio(0);
long komputerow = NumberOfNodes();
mojKomputer = MyNodeId();
studentow = NumberOfStudents();
long zapytan = NumberOfQueries();
if(zapytan == 0)
return 0;
vector<tZapytania> mojeZapytania;
for(long i = 0; i < zapytan; i++)
if(mojKomputer == i % komputerow)
mojeZapytania.push_back(tZapytania(i, QueryFrom(i + 1), QueryTo(i + 1)));
if(mojeZapytania.empty())
return 0;
long aktualny = 1;
long poprzedni = 0;
long kandydat;
while(true) {
size_t i = 0;
while(i < mojeZapytania.size()) {
if(mojeZapytania[i].from == aktualny) {
if(mojeZapytania[i].stan == '0') {
mojeZapytania[i].stan = 'P';
mojeZapytania[i].wynik = 0;
}
else
mojeZapytania[i].stan = 'L';
}
if(mojeZapytania[i].to == aktualny) {
if(mojeZapytania[i].stan == '0')
mojeZapytania[i].stan = 'K';
else
mojeZapytania[i].stan = 'R';
}
if(mojeZapytania[i].stan == 'R') {
ZwrocWynik(mojeZapytania[i].id, mojeZapytania[i].wynik);
mojeZapytania.erase(mojeZapytania.begin() + i);
} else {
if(mojeZapytania[i].stan != 'K')
++mojeZapytania[i].wynik;
++i;
}
}
if(!mojeZapytania.size())
break;
kandydat = FirstNeighbor(aktualny);
if(kandydat == poprzedni) {
poprzedni = aktualny;
aktualny = SecondNeighbor(aktualny);
} else {
poprzedni = aktualny;
aktualny = kandydat;
}
if(aktualny == 1)
break;
}
for(vector<tZapytania>::iterator it = mojeZapytania.begin(); it != mojeZapytania.end(); ++it)
ZwrocWynik(it->id, it->wynik);
if(mojKomputer == 0) {
while(zwroconychWynikow < zapytan) {
int source = Receive(-1);
long zadanie = GetInt(source);
while(zadanie >= 0) {
wyniki[zadanie] = GetInt(source);
++zwroconychWynikow;
zadanie = GetInt(source);
}
}
for(long i = 0; i < zapytan; i++)
cout << wyniki[i] << endl;
} else {
PutInt(0, -1);
Send(0);
}
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 | #include<iostream> #include<vector> #include"kollib.h" #include"message.h" //Message /* int NumberOfNodes() {return 1;} int MyNodeId() {return 0;} void PutInt(int target, int value) {} void Send(int target) {} int Receive(int source) {return source;} int GetInt(int source) {return -1;} */ using namespace std; long mojKomputer; long studentow; long wyniki[200]; long zwroconychWynikow = 0; void ZwrocWynik(long zadanie, long wynik) { if(wynik > studentow / 2) wynik = studentow - wynik; if(mojKomputer == 0) { wyniki[zadanie] = wynik; ++zwroconychWynikow; } else { PutInt(0, zadanie); PutInt(0, wynik); } } struct tZapytania { long id, from, to, wynik; char stan; //0; P; K; R=PK; L=KP tZapytania(long _i, long _f, long _t) : id(_i), from(_f), to(_t), wynik(0), stan('0') {}; }; int main() { ios_base::sync_with_stdio(0); long komputerow = NumberOfNodes(); mojKomputer = MyNodeId(); studentow = NumberOfStudents(); long zapytan = NumberOfQueries(); if(zapytan == 0) return 0; vector<tZapytania> mojeZapytania; for(long i = 0; i < zapytan; i++) if(mojKomputer == i % komputerow) mojeZapytania.push_back(tZapytania(i, QueryFrom(i + 1), QueryTo(i + 1))); if(mojeZapytania.empty()) return 0; long aktualny = 1; long poprzedni = 0; long kandydat; while(true) { size_t i = 0; while(i < mojeZapytania.size()) { if(mojeZapytania[i].from == aktualny) { if(mojeZapytania[i].stan == '0') { mojeZapytania[i].stan = 'P'; mojeZapytania[i].wynik = 0; } else mojeZapytania[i].stan = 'L'; } if(mojeZapytania[i].to == aktualny) { if(mojeZapytania[i].stan == '0') mojeZapytania[i].stan = 'K'; else mojeZapytania[i].stan = 'R'; } if(mojeZapytania[i].stan == 'R') { ZwrocWynik(mojeZapytania[i].id, mojeZapytania[i].wynik); mojeZapytania.erase(mojeZapytania.begin() + i); } else { if(mojeZapytania[i].stan != 'K') ++mojeZapytania[i].wynik; ++i; } } if(!mojeZapytania.size()) break; kandydat = FirstNeighbor(aktualny); if(kandydat == poprzedni) { poprzedni = aktualny; aktualny = SecondNeighbor(aktualny); } else { poprzedni = aktualny; aktualny = kandydat; } if(aktualny == 1) break; } for(vector<tZapytania>::iterator it = mojeZapytania.begin(); it != mojeZapytania.end(); ++it) ZwrocWynik(it->id, it->wynik); if(mojKomputer == 0) { while(zwroconychWynikow < zapytan) { int source = Receive(-1); long zadanie = GetInt(source); while(zadanie >= 0) { wyniki[zadanie] = GetInt(source); ++zwroconychWynikow; zadanie = GetInt(source); } } for(long i = 0; i < zapytan; i++) cout << wyniki[i] << endl; } else { PutInt(0, -1); Send(0); } return 0; } |
English