Tuesday, July 14, 2020

[Toph] Shopping is Fun!!

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : Shopping is Fun!!
Source            : Toph
Category          : Dynamic Programing
Algorithm         : SOS DP
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2. #include "ext/pb_ds/assoc_container.hpp"  
  3. #include "ext/pb_ds/tree_policy.hpp"  
  4. #include "ext/rope"  
  5.   
  6. using namespace std;  
  7. using namespace __gnu_pbds;  
  8. using namespace __gnu_cxx;  
  9.   
  10. /* 
  11. #pragma GCC optimize("O3") 
  12. #pragma GCC optimize("unroll-loops") 
  13. #pragma GCC target("avx,avx2,fma") 
  14. */  
  15.   
  16. void trace(int x)                         { cerr << x; }  
  17. void trace(long x)                        { cerr << x; }  
  18. void trace(long long x)                   { cerr << x; }  
  19. void trace(unsigned x)                    { cerr << x; }  
  20. void trace(unsigned long x)               { cerr << x; }  
  21. void trace(unsigned long long x)          { cerr << x; }  
  22. void trace(float x)                       { cerr << x; }  
  23. void trace(double x)                      { cerr << x; }  
  24. void trace(long double x)                 { cerr << x; }  
  25. void trace(char x)                        { cerr << '\'' << x << '\''; }  
  26. void trace(const char *x)                 { cerr << '\"' << x << '\"'; }  
  27. void trace(const string &x)               { cerr << '\"' << x << '\"'; }  
  28. void trace(bool x)                        { cerr << (x ? "true" : "false"); }  
  29.   
  30. template <typename A, typename B>                         void trace(const pair <A, B> &x)         { cerr << '{'; trace(x.first); cerr << ','; trace(x.second); cerr << '}'; }  
  31. template <typename A, typename B, typename C>             void trace(const tuple <A, B, C> &x)     { cerr << '{'; trace(get <0> (x)); cerr << ','; trace(get <1> (x)); cerr << ','; trace(get <2> (x)); cerr << '}'; }  
  32. template <typename A, typename B, typename C, typename D> void trace(const tuple <A, B, C, D> &x)  { cerr << '{'; trace(get <0> (x)); cerr << ','; trace(get <1> (x)); cerr << ','; trace(get <2> (x)); cerr << ','; trace(get <3> (x)); cerr << '}'; }  
  33. template <typename T>                                     void trace(const T &x)                   { int f = 0; cerr << '{'for (auto &i: x) cerr << (f++ ? "," : ""), trace(i); cerr << "}"; }  
  34. template <size_t N>                                       void trace(bitset <N> v)                 { cerr << '{'for (size_t i = 0; i < N; i++) cerr << static_cast <char> ('0' + v[i]); cerr << '}'; }  
  35. void _print()                                                                                      { cerr << "]\n"; }  
  36. template <typename T, typename... V>                      void _print(T t, V... v)                 { trace(t); if (sizeof...(v)) cerr << ", "; _print(v...); }  
  37.   
  38. #ifndef ONLINE_JUDGE  
  39.       #define debug(x...) cerr << "[" << #x << "] = ["; _print(x)  
  40. #else  
  41.       #define debug(x...)  
  42. #endif  
  43.   
  44. template <typename T> using ordered_set                = tree <T, null_type, less <T>, rb_tree_tag, tree_order_statistics_node_update>;  
  45. template <typename T1, typename T2> using ordered_map  = tree <T1, T2, less <T1>, rb_tree_tag, tree_order_statistics_node_update>;  
  46.   
  47. template <class T> bool MIN(T &a, T b)                 { return a > b ? (a = b, true) : false; }  
  48. template <class T> bool MAX(T &a, T b)                 { return a < b ? (a = b, true) : false; }  
  49.   
  50. template <class T> T binaryExpo(T a, T p)              { if (p == 0) { return 1LL; } if (p == 1) { return a; } if (p & 1) { return a * binaryExpo(a, p - 1); } T ret = binaryExpo(a, p / 2); return ret * ret; }  
  51. template <class T> T bigMod(T a, T p, T m)             { if (p == 0) { return 1LL % m; } if (p == 1) { return a % m; } if (p & 1) { return (a % m * bigMod(a, p - 1, m)) % m; } T ret = bigMod(a, p / 2, m) % m; return (ret * ret) % m; }  
  52. template <class T> T modInv(T a, T m)                  { return bigMod(a, m - 2, m); }  
  53.   
  54. template <typename T> string num_str(T num)            { stringstream ss; ss << num; return ss.str(); }  
  55. long long str_num(string s)                            { long long num; istringstream iss(s); iss >> num; return num; }  
  56.   
  57. inline long long ON(long long mask, int pos)           { return mask |= (1LL << pos); }  
  58. inline long long OFF(long long mask, int pos)          { return mask &= ~(1LL << pos); }  
  59. inline long long TOGGLE(long long mask, int pos)       { return mask ^= (1LL << pos); }  
  60. inline bool CHECK(long long mask, int pos)             { return (bool)(mask >> pos & 1LL); }  
  61.   
  62. inline int ONE(long long mask)                         { return __builtin_popcountll(mask); }  
  63. inline int LZERO(long long mask)                       { return 31 - __builtin_clzll(mask); };  
  64. inline int TZERO(long long mask)                       { return __builtin_ctzll(mask); };  
  65.   
  66. //int dr[] = {+1, -1, +0, +0};                         // 4 Direction - DOWN, UP, RIGHT, LEFT  
  67. //int dc[] = {+0, +0, +1, -1};  
  68. int dr[] = {+0, +0, +1, -1, +1, +1, -1, -1};       // 8 Direction - RIGHT, LEFT, DOWN, UP, RIGHT-DOWN, LEFT-DOWN, UP-RIGHT, UP-LEFT  
  69. int dc[] = {+1, -1, +0, +0, +1, -1, +1, -1};  
  70. //int dr[] = {-1, +1, -2, -2, -1, +1, +2, +2};       // knight Moves  
  71. //int dc[] = {-2, -2, -1, +1, +2, +2, +1, -1};  
  72.   
  73. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());  
  74.   
  75. #define ll              long long int  
  76. #define ull             unsigned long long int  
  77. #define endl            '\n'  
  78. #define pii             pair <int, int>  
  79. #define pll             pair <ll, ll>  
  80. #define mk              make_pair  
  81. #define ff              first  
  82. #define ss              second  
  83. #define all(a)          (a).begin(), (a).end()  
  84. #define rall(a)         (a).rbegin(), (a).rend()  
  85. #define eb              emplace_back  
  86. #define pb              push_back  
  87. #define pf              push_front  
  88. #define allUpper(a)     transform(all(a), a.begin(), :: toupper)  
  89. #define allLower(a)     transform(all(a), a.begin(), :: tolower)  
  90. #define LINE            cerr << __LINE__ << " ";  
  91. #define memo(a, b)      memset(a, b, sizeof a)  
  92. #define ook             order_of_key  
  93. #define fbo             find_by_order  
  94.   
  95. #define int               long long int  
  96.   
  97. static const int maxn = (1 << 20) + 5;  
  98. static const int logn = 19;  
  99. static const long long MOD = 1e9 + 7;  
  100. static const long long INF = 1e18;  
  101.   
  102. int counter[maxn];  
  103. vector <int> masks;  
  104.   
  105. signed main()  
  106. {  
  107.       ios_base::sync_with_stdio(false);  
  108.       cin.tie(nullptr);  
  109.       cout.tie(nullptr);  
  110.       cout.precision(12);  
  111.   
  112.       #ifndef ONLINE_JUDGE  
  113.           freopen("in.txt""r", stdin);  
  114.       #endif // ONLINE_JUDGE  
  115.   
  116.       int tc;  
  117.       cin >> tc;  
  118.       while (tc--) {  
  119.             int n, m;  
  120.             cin >> n >> m;  
  121.             vector <int> masks(n);  
  122.             vector <int> sos(1 << m);  
  123.             int zero = 0;  
  124.             int nonzero = 0;  
  125.             for (int i = 0; i < n; i++) {  
  126.                   int mask = 0;  
  127.                   for (int j = m - 1; j >= 0; j--) {  
  128.                         int x;  
  129.                         cin >> x;  
  130.                         mask += (1 << j) * x;  
  131.                   }  
  132.                   masks[i] = mask;  
  133.                   if (mask) {  
  134.                         sos[mask]++;  
  135.                   }  
  136.                   else {  
  137.                         zero++;  
  138.                   }  
  139.             }  
  140.             debug(masks);  
  141.             for (int i = 0; i < m; i++) {  
  142.                   for (int mask = 0; mask < (1 << m); mask++) {  
  143.                         if (mask >> i & 1) {  
  144.                               sos[mask] += sos[mask ^ (1 << i)];  
  145.                         }  
  146.                   }  
  147.             }  
  148.             int ans = 0;  
  149.             for (int i = 0; i < n; i++) {  
  150.                   for (int j = i + 1; j < n; j++) {  
  151.                         if (masks[i] and masks[j] and ((masks[i] & masks[j]) == 0)) {  
  152.                               int mymask = ((1 << m) - 1) ^ (masks[i] | masks[j]);  
  153.                               debug(masks[i], masks[j], mymask, sos[mymask]);  
  154.                               ans += sos[mymask];  
  155.                               nonzero++;  
  156.                         }  
  157.                   }  
  158.             }  
  159.             debug(zero, nonzero);  
  160.             ans /= 3;  
  161.             ans += zero * nonzero;  
  162.             ans += zero * (zero - 1) * (n - zero) / 2;  
  163.             ans += zero * (zero - 1) * (zero - 2) / 6;  
  164.             cout << ans << endl;  
  165.       }  
  166.   
  167.       #ifndef ONLINE_JUDGE  
  168.             cerr << endl << "Time : " << 1.0 * clock() / CLOCKS_PER_SEC << " s." << endl;  
  169.       #endif // ONLINE_JUDGE  
  170.   
  171.       return 0;  
  172. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.