_rashed

SRM534-D1-250 EllysCheckers

Jan 25th, 2023
741
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.06 KB | None | 0 0
  1. #define ll long long
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. /*
  6. Ordered set usage:
  7. order_of_key (k) : Number of items strictly smaller than k.
  8. find_by_order(k) : K-th element in a set (counting from zero).
  9. */
  10.  
  11. #include <ext/pb_ds/assoc_container.hpp>
  12. #include <ext/pb_ds/tree_policy.hpp>
  13. using namespace __gnu_pbds;
  14. #define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
  15.  
  16. const int OO = 1e9;
  17. const double EPS = 1e-9;
  18. int mem[2000000];
  19. class EllysCheckers
  20. {
  21. public:
  22.  
  23.     int solve(int state, int rem)
  24.     {
  25.         //cout << "here at state = " << state << " rem = " << rem << "\n";
  26.         if(rem == 0) {
  27.             return 0;
  28.         }
  29.         if(mem[state] != -1) {
  30.             return mem[state];
  31.         }
  32.         bool ret = 0;
  33.         for(int i = 19; i >= 1; i--) {
  34.             int pos = (1 << i);
  35.             if(state&pos) {
  36.                 if(!(state&(pos/2))) {
  37.                     if(i == 1) {
  38.                         ret = max(ret,!solve(state^pos,rem-1));
  39.                     }
  40.                     else {
  41.                         ret = max(ret,!solve((state^pos) | (pos/2),rem));
  42.                     }
  43.                 }
  44.                 else if(i >= 3 && (state&(pos/4)) && !(state&(pos/8))) {
  45.                     if(i == 3) {
  46.                         ret = max(ret,!solve(state^pos,rem-1));
  47.                     }
  48.                     else {
  49.                         ret = max(ret,!solve((state^pos) | (pos/8),rem));
  50.                     }
  51.                 }
  52.             }
  53.         }
  54.         mem[state] = ret;
  55.         return ret;
  56.     }
  57.  
  58.     string getWinner(string board)
  59.     {
  60.         int state = 0;
  61.         int pos = 2;
  62.         int cnt = 0;
  63.         for(int i = board.size()-2; i >= 0; i--)
  64.         {
  65.             if(board[i] == 'o')
  66.             {
  67.                 state |= pos;
  68.                 cnt++;
  69.             }
  70.             pos <<= 1;
  71.         }
  72.         for(int i = 0; i <= state; i++) {
  73.             mem[i] = -1;
  74.         }
  75.         return (solve(state, cnt) ? "YES":"NO");
  76.     }
  77. };
  78.  
Advertisement
Add Comment
Please, Sign In to add comment