Advertisement
Mlxa

G.cpp

Aug 27th, 2018
390
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.64 KB | None | 0 0
  1. #ifdef LOCAL
  2.     #define _GLIBCXX_DEBUG
  3. #else
  4.     #define NDEBUG
  5.     #pragma GCC optimize("O3")
  6.     #pragma GCC target("arch=corei7-avx")
  7. #endif
  8. #include <bits/stdc++.h>
  9. #define int long long
  10. #define float long double
  11. #define all(x) begin(x), end(x)
  12. using namespace std;
  13.  
  14. template<class A>
  15. void addlog(A a)
  16. {
  17.     cerr << a << endl;
  18. }
  19.  
  20. template<class A, class... B>
  21. void addlog(A a, B... b)
  22. {
  23.     cerr << a << ' '; addlog(b...);
  24. }
  25.  
  26. template<class T>
  27. ostream & operator <<(ostream & out, vector<T> v)
  28. {
  29.     for (T & e : v)
  30.     {
  31.         out << e << ' ';
  32.     }
  33.     return out << endl;
  34. }
  35.  
  36.  
  37.  
  38.  
  39.  
  40. void ask(vector<int> t, int & left, int & right)
  41. {
  42.     assert(is_sorted(all(t)));
  43.     cout << t.size() << ' ';
  44.     for (int e : t)
  45.     {
  46.         cout << e << ' ';
  47.     }
  48.     cout << endl;
  49.     int res;
  50.     cin >> res;
  51.     if (res < 0)
  52.     {
  53.         exit(0);
  54.     }
  55.     if (res == 0)
  56.     {
  57.         right = min(right, t.front() - 1);
  58.     }
  59.     else if (res
  60.      == (int)t.size())
  61.     {
  62.         left = max(left, t.back() + 1);
  63.     }
  64.     else
  65.     {
  66.         left = max(left, t[res - 1] + 1);
  67.         right = min(right, t[res] - 1);
  68.     }
  69. }
  70.  
  71.  
  72. //~ void play(int k, int m, int l)
  73. //~ {
  74.     //~ // k = min
  75.     //~ // m = max
  76.     //~ // l = least steps
  77.     //~ assert(l > 0);
  78.     //~ addlog("playing", k, m, "least", l);
  79.     //~ if (k == 1)
  80.     //~ {
  81.         //~ if (l == 5)
  82.         //~ {
  83.             //~ ask({ 10'000 }, k, m);
  84.             //~ play(k, m, l - 1);
  85.         //~ }
  86.         //~ if (l == 4)
  87.         //~ {
  88.             //~ ask({ 79 }, k, m);
  89.             //~ play(k, m, l - 1);
  90.         //~ }
  91.         //~ if (l == 3)
  92.         //~ {
  93.             //~ ask({ 6 }, k, m);
  94.             //~ play(k, m, l - 1);
  95.         //~ }
  96.         //~ if (l == 2)
  97.         //~ {
  98.             //~ ask({ 2 }, k, m);
  99.             //~ play(k, m, l - 1);
  100.         //~ }
  101.         //~ if (l == 1)
  102.         //~ {
  103.             //~ ask({ 1 }, k, m);
  104.             //~ play(k, m, l - 1);
  105.         //~ }
  106.     //~ }
  107.     //~ else
  108.     //~ {
  109.         //~ if (k == 3)
  110.         //~ {
  111.             //~ assert(m == 5);
  112.             //~ ask({ 3, 4, 5 }, k, m);
  113.             //~ play(k, m, l - 1);
  114.         //~ }
  115.         //~ else
  116.         //~ {
  117.             //~ assert(k > 3);
  118.             //~ vector<int> t(k);
  119.             //~ int d = (m - k + 1) / k;
  120.             //~ for (int i = 0; i < k; ++i)
  121.             //~ {
  122.                 //~ t[i] = k + (i + 1) * d;
  123.             //~ }
  124.             //~ t[0] -= 2;
  125.             //~ t[1] -= 1;
  126.             //~ t[k - 2] += 2;
  127.             //~ t[k - 1] += 3;
  128.             //~ ask(t, k, m);
  129.             //~ play(k, m, l - 1);
  130.         //~ }
  131.     //~ }
  132.     //~ assert(false);
  133. //~ }
  134.  
  135. map<pair<int, int>, bool> mem[10];
  136.  
  137. bool good(int k, int m, int l)
  138. {
  139.     //~ addlog(k, m, l);
  140.     if (l <= 0) return false;
  141.     if (m - k + 1 <= k) return true;
  142.     if (l == 1) return false;
  143.     if (mem[l].count({k, m})) return mem[l][{k, m}];
  144.     for (int i = 0, ee = min(k, 10000LL); i < ee; ++i)
  145.     {
  146.         int mid, lef = k, rig = m;
  147.         assert(good(k, lef - 1, l - 1));
  148.         for (; rig - lef > 1; )
  149.         {
  150.             mid = (lef + rig) / 2;
  151.             if (good(k, mid - 1, l - 1))
  152.             {
  153.                 lef = mid;
  154.             }
  155.             else
  156.             {
  157.                 rig = mid;
  158.             }
  159.         }
  160.         assert(good(k, lef - 1, l - 1));
  161.         k = lef + 1;
  162.     }
  163.     //~ addlog("---");
  164.     return mem[l][{k, m}] = good(k, m, l - 1);
  165. }
  166.  
  167.  
  168. bool play(int k, int m, int l)
  169. {
  170.     addlog("playing", k, m, l);
  171.     assert(good(k, m, l));
  172.     vector<int> t;
  173.     t.reserve(min(k, 10000LL));
  174.     if (l == 1)
  175.     {
  176.         for (int i = k; i <= m; ++i)
  177.         {
  178.             t.push_back(i);
  179.         }
  180.         assert((int)t.size() <= k);
  181.         ask(t, k, m);
  182.         assert(false);
  183.     }
  184.     for (int i = 0, ee = min(k, 10000LL), kk = k; i < ee; ++i)
  185.     {
  186.         int mid, lef = kk, rig = m;
  187.         assert(good(kk, lef - 1, l - 1));
  188.         for (; rig - lef > 1; )
  189.         {
  190.             mid = (lef + rig) / 2;
  191.             if (good(kk, mid - 1, l - 1))
  192.             {
  193.                 lef = mid;
  194.             }
  195.             else
  196.             {
  197.                 rig = mid;
  198.             }
  199.         }
  200.         assert(good(kk, lef - 1, l - 1));
  201.         if (k <= lef && lef <= m) t.push_back(lef);
  202.         kk = lef + 1;
  203.     }
  204.     ask(t, k, m);
  205.     play(k, m, l - 1);
  206. }
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213. const int INF = 1e18 + 15;
  214.  
  215.  
  216.  
  217. int32_t main()
  218. {
  219.     play(1, 10004205361450474LL, 5);
  220.     return 0;
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement