#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; } |
English