#include <iostream> #include <map> #include <algorithm> using namespace std; int tab[1000][2]; int w; int w100; map<int, pair<int,int>> kraw; map<int, int> mapowanie; void rek(int k) { //printf("rek(%d,%d)\n",k,w0); if(k<3) return; if(kraw.find(k) != kraw.end()) { return; } else { if(k%2) { kraw[k].first=k/2; kraw[k].second=k/2+1; rek(k/2); rek(k/2+1); } else { kraw[k].first=1000000100+k; kraw[1000000100+k].first=k/2; kraw[1000000100+k].second=-2; kraw[k].second=k/2; rek(k/2); } } } void mapuj(int k) { w=0; auto p = kraw[k]; kraw.erase(k); kraw[k+1000000101]=p; for_each(kraw.begin(),kraw.end(),[&](auto k){ mapowanie[k.first] = w++; }); for_each(kraw.begin(),kraw.end(),[&](auto k){ if(k.second.first>=0) tab[mapowanie[k.first]][0]=mapowanie[k.second.first]; else tab[mapowanie[k.first]][0]=w+1; if(k.second.second>=0) tab[mapowanie[k.first]][1]=mapowanie[k.second.second]; else tab[mapowanie[k.first]][1]=w+1; }); } void wypisz() { for_each(kraw.begin(),kraw.end(),[&](auto k){ printf("[%d]: %d %d\n",k.first,k.second.first,k.second.second); }); for_each(mapowanie.begin(),mapowanie.end(),[&](auto k){ printf("mapowanie[%d]=%d\n",k.first,mapowanie[k.first]); }); } int fun(int k) { kraw.clear(); mapowanie.clear(); kraw[0]=make_pair(-2,-2); kraw[1]=make_pair(0,-2); kraw[2]=make_pair(0,1); if(k==1){printf("2\n2 -1\n-1 -1\n");return 2;} if(k>2)rek(k); mapuj(k); //wypisz(); printf("%d\n",w); for(int i=w-1;i>=0;i--)printf("%d %d\n",w-tab[i][0],w-tab[i][1]); return w; } int main() { // your code goes here int k; scanf("%d",&k); fun(k); //for(int i=1;i<4;i++)fun(i); 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 | #include <iostream> #include <map> #include <algorithm> using namespace std; int tab[1000][2]; int w; int w100; map<int, pair<int,int>> kraw; map<int, int> mapowanie; void rek(int k) { //printf("rek(%d,%d)\n",k,w0); if(k<3) return; if(kraw.find(k) != kraw.end()) { return; } else { if(k%2) { kraw[k].first=k/2; kraw[k].second=k/2+1; rek(k/2); rek(k/2+1); } else { kraw[k].first=1000000100+k; kraw[1000000100+k].first=k/2; kraw[1000000100+k].second=-2; kraw[k].second=k/2; rek(k/2); } } } void mapuj(int k) { w=0; auto p = kraw[k]; kraw.erase(k); kraw[k+1000000101]=p; for_each(kraw.begin(),kraw.end(),[&](auto k){ mapowanie[k.first] = w++; }); for_each(kraw.begin(),kraw.end(),[&](auto k){ if(k.second.first>=0) tab[mapowanie[k.first]][0]=mapowanie[k.second.first]; else tab[mapowanie[k.first]][0]=w+1; if(k.second.second>=0) tab[mapowanie[k.first]][1]=mapowanie[k.second.second]; else tab[mapowanie[k.first]][1]=w+1; }); } void wypisz() { for_each(kraw.begin(),kraw.end(),[&](auto k){ printf("[%d]: %d %d\n",k.first,k.second.first,k.second.second); }); for_each(mapowanie.begin(),mapowanie.end(),[&](auto k){ printf("mapowanie[%d]=%d\n",k.first,mapowanie[k.first]); }); } int fun(int k) { kraw.clear(); mapowanie.clear(); kraw[0]=make_pair(-2,-2); kraw[1]=make_pair(0,-2); kraw[2]=make_pair(0,1); if(k==1){printf("2\n2 -1\n-1 -1\n");return 2;} if(k>2)rek(k); mapuj(k); //wypisz(); printf("%d\n",w); for(int i=w-1;i>=0;i--)printf("%d %d\n",w-tab[i][0],w-tab[i][1]); return w; } int main() { // your code goes here int k; scanf("%d",&k); fun(k); //for(int i=1;i<4;i++)fun(i); return 0; } |