#include "message.h"
#include<iostream>
#include<algorithm>
#include<vector>
#include "kollib.h"
using namespace std;
#define nd second
#define st first
long long los(){
long long w=0;
for(int i=0;i<60;i++)w=2*w+rand()%2;
return w;
}
int inst,n;
vector<int>losuj_starty(int ile){
vector<int>w;
for(int i=0;i<inst;i++)w.push_back(los()%ile+1);
sort(w.begin(),w.end());
bool ok=1;
for(int i=0;i<inst-1;i++)if(w[i]==w[i+1])ok=0;
if(ok)return w;
return losuj_starty(ile);
}
void zerowa(){
vector<int>starty=losuj_starty(n);
for(int i=1;i<inst+1;i++){
for(int j=0;j<starty.size();j++)PutInt(i,starty[j]);
Send(i);
}
vector<pair<int,int> >lista[inst+10],lista2[inst+10];
for(int i=0;i<inst;i++){
int nadawca=Receive(-1);
int ile=GetInt(nadawca);
for(int j=0;j<ile;j++){
lista[nadawca-1].push_back(make_pair(0,0));
lista[nadawca-1][j].st=GetInt(nadawca);
lista[nadawca-1][j].nd=GetInt(nadawca);
}
int ile2=GetInt(nadawca);
for(int j=0;j<ile2;j++){
lista2[nadawca-1].push_back(make_pair(0,0));
lista2[nadawca-1][j].st=GetInt(nadawca);
lista2[nadawca-1][j].nd=GetInt(nadawca);
}
}
int ostatni=0,akt=starty[0];
vector<pair<int,int> >poz;
int pop=-1;
for(int i=0;i<inst;i++){
int nr;
for(int j=0;j<starty.size();j++)if(starty[j]==akt)nr=j;
if(lista[nr][lista[nr].size()-1].st==pop)lista[nr]=lista2[nr];
for(int j=0;j<lista[nr].size()-1;j++){
ostatni+=lista[nr][j].nd;
poz.push_back(make_pair(ostatni,lista[nr][j].st));
}
ostatni+=lista[nr][lista[nr].size()-1].nd;
pop=akt;
akt=lista[nr][lista[nr].size()-1].st;
}
sort(poz.begin(),poz.end());
for(int i=0;i<NumberOfQueries();i++){
int a,b;
for(int j=0;j<poz.size();j++)if(poz[j].nd==QueryFrom(i+1))a=poz[j].st;
for(int j=0;j<poz.size();j++)if(poz[j].nd==QueryTo(i+1))b=poz[j].st;
if(a>b)swap(a,b);
cout<<min(b-a,a-b+n)<<"\n";
}
}
void zwykla(){
int mojnr=MyNodeId();
vector<int>starty,wazne;
Receive(0);
for(int i=0;i<inst;i++)starty.push_back(GetInt(0));
for(int i=0;i<NumberOfQueries();i++){
wazne.push_back(QueryFrom(i+1));
wazne.push_back(QueryTo(i+1));
}
sort(wazne.begin(),wazne.end());
vector<pair<int,int> >lista,lista2;
int akt=starty[mojnr-1],odl=0,ost=0,pop=-1;
while(1){
if(binary_search(starty.begin(),starty.end(),akt)&&akt!=starty[mojnr-1]){
lista.push_back(make_pair(akt,odl-ost));
ost=odl;
break;
}
if(binary_search(wazne.begin(),wazne.end(),akt)){
lista.push_back(make_pair(akt,odl-ost));
ost=odl;
}
int nast=FirstNeighbor(akt);
if(nast==pop)nast=SecondNeighbor(akt);
pop=akt;
akt=nast;
odl++;
}
akt=starty[mojnr-1];
pop=-1;
while(1){
if(binary_search(starty.begin(),starty.end(),akt)&&akt!=starty[mojnr-1]){
lista2.push_back(make_pair(akt,odl-ost));
ost=odl;
break;
}
if(binary_search(wazne.begin(),wazne.end(),akt)){
lista2.push_back(make_pair(akt,odl-ost));
ost=odl;
}
int nast=SecondNeighbor(akt);
if(nast==pop)nast=FirstNeighbor(akt);
pop=akt;
akt=nast;
odl++;
}
PutInt(0,lista.size());
for(int i=0;i<lista.size();i++){
PutInt(0,lista[i].st);
PutInt(0,lista[i].nd);
}
PutInt(0,lista2.size());
for(int i=0;i<lista2.size();i++){
PutInt(0,lista2[i].st);
PutInt(0,lista2[i].nd);
}
Send(0);
}
main(){
inst=NumberOfNodes()-1;
n=NumberOfStudents();
if(n<100)inst=3;
if(n<10)inst=2;
if(MyNodeId()>inst)return 0;
if(MyNodeId()==0)zerowa();
else zwykla();
}
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 129 130 131 132 133 134 135 136 | #include "message.h" #include<iostream> #include<algorithm> #include<vector> #include "kollib.h" using namespace std; #define nd second #define st first long long los(){ long long w=0; for(int i=0;i<60;i++)w=2*w+rand()%2; return w; } int inst,n; vector<int>losuj_starty(int ile){ vector<int>w; for(int i=0;i<inst;i++)w.push_back(los()%ile+1); sort(w.begin(),w.end()); bool ok=1; for(int i=0;i<inst-1;i++)if(w[i]==w[i+1])ok=0; if(ok)return w; return losuj_starty(ile); } void zerowa(){ vector<int>starty=losuj_starty(n); for(int i=1;i<inst+1;i++){ for(int j=0;j<starty.size();j++)PutInt(i,starty[j]); Send(i); } vector<pair<int,int> >lista[inst+10],lista2[inst+10]; for(int i=0;i<inst;i++){ int nadawca=Receive(-1); int ile=GetInt(nadawca); for(int j=0;j<ile;j++){ lista[nadawca-1].push_back(make_pair(0,0)); lista[nadawca-1][j].st=GetInt(nadawca); lista[nadawca-1][j].nd=GetInt(nadawca); } int ile2=GetInt(nadawca); for(int j=0;j<ile2;j++){ lista2[nadawca-1].push_back(make_pair(0,0)); lista2[nadawca-1][j].st=GetInt(nadawca); lista2[nadawca-1][j].nd=GetInt(nadawca); } } int ostatni=0,akt=starty[0]; vector<pair<int,int> >poz; int pop=-1; for(int i=0;i<inst;i++){ int nr; for(int j=0;j<starty.size();j++)if(starty[j]==akt)nr=j; if(lista[nr][lista[nr].size()-1].st==pop)lista[nr]=lista2[nr]; for(int j=0;j<lista[nr].size()-1;j++){ ostatni+=lista[nr][j].nd; poz.push_back(make_pair(ostatni,lista[nr][j].st)); } ostatni+=lista[nr][lista[nr].size()-1].nd; pop=akt; akt=lista[nr][lista[nr].size()-1].st; } sort(poz.begin(),poz.end()); for(int i=0;i<NumberOfQueries();i++){ int a,b; for(int j=0;j<poz.size();j++)if(poz[j].nd==QueryFrom(i+1))a=poz[j].st; for(int j=0;j<poz.size();j++)if(poz[j].nd==QueryTo(i+1))b=poz[j].st; if(a>b)swap(a,b); cout<<min(b-a,a-b+n)<<"\n"; } } void zwykla(){ int mojnr=MyNodeId(); vector<int>starty,wazne; Receive(0); for(int i=0;i<inst;i++)starty.push_back(GetInt(0)); for(int i=0;i<NumberOfQueries();i++){ wazne.push_back(QueryFrom(i+1)); wazne.push_back(QueryTo(i+1)); } sort(wazne.begin(),wazne.end()); vector<pair<int,int> >lista,lista2; int akt=starty[mojnr-1],odl=0,ost=0,pop=-1; while(1){ if(binary_search(starty.begin(),starty.end(),akt)&&akt!=starty[mojnr-1]){ lista.push_back(make_pair(akt,odl-ost)); ost=odl; break; } if(binary_search(wazne.begin(),wazne.end(),akt)){ lista.push_back(make_pair(akt,odl-ost)); ost=odl; } int nast=FirstNeighbor(akt); if(nast==pop)nast=SecondNeighbor(akt); pop=akt; akt=nast; odl++; } akt=starty[mojnr-1]; pop=-1; while(1){ if(binary_search(starty.begin(),starty.end(),akt)&&akt!=starty[mojnr-1]){ lista2.push_back(make_pair(akt,odl-ost)); ost=odl; break; } if(binary_search(wazne.begin(),wazne.end(),akt)){ lista2.push_back(make_pair(akt,odl-ost)); ost=odl; } int nast=SecondNeighbor(akt); if(nast==pop)nast=FirstNeighbor(akt); pop=akt; akt=nast; odl++; } PutInt(0,lista.size()); for(int i=0;i<lista.size();i++){ PutInt(0,lista[i].st); PutInt(0,lista[i].nd); } PutInt(0,lista2.size()); for(int i=0;i<lista2.size();i++){ PutInt(0,lista2[i].st); PutInt(0,lista2[i].nd); } Send(0); } main(){ inst=NumberOfNodes()-1; n=NumberOfStudents(); if(n<100)inst=3; if(n<10)inst=2; if(MyNodeId()>inst)return 0; if(MyNodeId()==0)zerowa(); else zwykla(); } |
English