Advertisement
Guest User

Untitled

a guest
Dec 30th, 2016
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.82 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <string>
  4. #include <vector>
  5. #include <cmath>
  6. #include <cstdlib>
  7. #include <algorithm>
  8. #include <set>
  9.  
  10. struct node
  11. {
  12.     bool known;
  13.     int c;
  14.     int p[3];
  15. };
  16.  
  17. node N[512];
  18. int found;
  19.  
  20. int tree_h;
  21. int x_to_tree[512];
  22. int x_from_tree[512];
  23. int asks;
  24.  
  25. void getp(int x, int *p, int *c)
  26. {
  27.     int z = x_to_tree[x];
  28.     *c = 0;
  29.     if (z != 0)
  30.         p[(*c)++] = x_from_tree[(z-1)/2];
  31.     if (z < (1<<(tree_h)) - 1)
  32.     {
  33.         p[(*c)++] = x_from_tree[z*2+1];
  34.         p[(*c)++] = x_from_tree[z*2+2];
  35.     }
  36.     /*printf("? %d\n", x+1);
  37.     printf("%d\n", *c);
  38.     for (int i=0; i<*c; ++i)
  39.         printf("%d ", p[i]+1);
  40.     printf("\n");*/
  41. }
  42.  
  43. void check(int x)
  44. {
  45.     if (x < 0 || x >= (1<<(tree_h+1))-1)
  46.         throw "asd";
  47. }
  48.  
  49. void ask(int x)
  50. {
  51.     check(x);
  52.     node &n = N[x];
  53.     if (n.known)
  54.         throw "qwe";
  55.     if (asks == 16)
  56.     {
  57.         found = x;
  58.         return;
  59.     }
  60.     getp(x, n.p, &n.c);
  61.     /*printf("? %d\n", x+1);
  62.     fflush(stdout);
  63.     scanf("\n%d\n", &n.c);
  64.     for (int i=0; i<n.c; ++i)
  65.     {
  66.         scanf("%d", &(n.p[i]));
  67.         --n.p[i];
  68.     }*/
  69.     n.known = true;
  70.     if (n.c == 2)
  71.         found = x;
  72.     ++asks;
  73. }
  74.  
  75. void answer(int x)
  76. {
  77.     check(x);
  78.     //printf("! %d\n", x+1);
  79.     //fflush(stdout);
  80.     if (x_to_tree[x] != 0)
  81.     {
  82.         printf("\nERROR %d\n", x+1);
  83.         for (int i=0; i<(1<<(tree_h+1))-1; ++i)
  84.             printf("%d, ", x_from_tree[i]+1);
  85.         exit(0);
  86.     }
  87. }
  88.  
  89. int wave(int from, int to)
  90. {
  91.     node &n = N[to];
  92.     if (!n.known)
  93.         return -1;
  94.     if (n.c == 1)
  95.         return 1;
  96.     for (int i=0; i<n.c; ++i)
  97.     {
  98.         if (n.p[i] == from)
  99.             continue;
  100.         int r = wave(to, n.p[i]);
  101.         if (r >= 0)
  102.             return r + 1;
  103.     }
  104.     return -1;
  105. }
  106.  
  107. int wherego(int x)
  108. {
  109.     check(x);
  110.     node &n = N[x];
  111.     if (!n.known)
  112.         ask(x);
  113.     if (found >= 0)
  114.         return found;
  115.     if (n.c == 1)
  116.         return n.p[0];
  117.     if (n.c != 3)
  118.         throw "qwe";
  119.     int k[3];
  120.     int z[3];
  121.     int kc = 0;
  122.     for (int i=0; i<3; ++i)
  123.     {
  124.         k[i] = wave(x, n.p[i]);
  125.         if (k[i] >= 0)
  126.         {
  127.             z[kc] = i;
  128.             ++kc;
  129.         }
  130.     }
  131.     if (kc < 2)
  132.     {
  133.         int j = n.p[0];
  134.         if (k[0] >= 0)
  135.             j = n.p[1];
  136.         if(!N[j].known)
  137.             ask(j);
  138.         if (found >= 0)
  139.             return found;
  140.         int prev = x;
  141.         for (;;)
  142.         {
  143.             int w = -1;
  144.             if (N[j].c == 1)
  145.                 break;
  146.             for(int l=0; l<N[j].c; ++l)
  147.                 if (N[j].p[l] != prev
  148.                  && N[N[j].p[l]].known)
  149.                     w = N[j].p[l];
  150.             if (w >= 0)
  151.             {
  152.                 prev = j;
  153.                 j = w;
  154.             }
  155.             else
  156.             {
  157.                 int tmp = prev;
  158.                 prev = j;
  159.                 j = (N[j].p[0] == tmp ? N[j].p[1] : N[j].p[0]);
  160.                 ask(j);
  161.                 if (found >= 0)
  162.                     return found;
  163.             }
  164.         }
  165.         return wherego(x);
  166.     }
  167.     else
  168.     {
  169.         if (k[z[0]]==k[z[1]])
  170.             return n.p[z[1]+1];
  171.         if (k[z[0]]>k[z[1]])
  172.             return n.p[z[0]];
  173.         return n.p[z[1]];
  174.     }
  175. }
  176.  
  177. int solve()
  178. {
  179.     //scanf("\n%d",&tree_h);
  180.     for (int i=0; i<512; ++i)
  181.         N[i].known = false;
  182.     int next = 0;
  183.     found = -1;
  184.     asks = 0;
  185.     for(int i=0;i<16;++i)
  186.     {
  187.         next = wherego(next);
  188.         if (found >= 0)
  189.             return found;
  190.     }
  191.     return next;
  192. }
  193.  
  194. void random_test()
  195. {
  196.     tree_h = 7;//2 + (rand()%6);
  197.     int n = (1<<(tree_h+1))-1;
  198.     for (int i=0; i<n; ++i)
  199.         x_from_tree[i] = i;
  200.     std::random_shuffle(x_from_tree, x_from_tree+n);
  201.     int qwe[512] = { 9, 26, 61, 8, 49, 41, 51, 52, 29, 35, 60, 45, 11, 38, 24, 19, 40, 31, 50, 39, 58, 32, 16, 18, 5, 3, 30, 28,
  202. 62, 43, 22, 36, 46, 47, 12, 44, 56, 59, 15, 37, 13, 25, 27, 48, 53, 57, 54, 55, 34, 7, 63, 20, 6, 2, 4, 23,
  203. 10, 42, 1, 33, 21, 14, 17, 0,};
  204.     /*int zz = 0;
  205.     for (int i=0; i<512; ++i)
  206.         if (!qwe[i])
  207.         {
  208.             zz = i + 1;
  209.             break;
  210.         }
  211.     printf("=%d=",zz);
  212.     tree_h = 0;
  213.     for (; 1<<(tree_h+1) != zz; ++tree_h) ;
  214.     for (int i=0; i<512; ++i)
  215.         x_from_tree[i] = qwe[i] - 1;*/
  216.     for (int i=0; i<n; ++i)
  217.         x_to_tree[x_from_tree[i]] = i;
  218.     int r = solve();
  219.     if (asks > 16)
  220.         answer(511);
  221.     //printf("%d\n", r);
  222.     answer(r);
  223. }
  224.  
  225. int main()
  226. {
  227.     for(;;) random_test();
  228.     int n;
  229.     scanf("%d", &n);
  230.     for (int i=0; i<n; ++i)
  231.     {
  232.         int r = solve();
  233.         answer(r);
  234.     }
  235.     return 0;
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement