#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(); } |