Saturday, April 4, 2020

[Codeforces] E. Compatible Numbers

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : E. Compatible Numbers
Source            : Codeforces
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.   
  5. using namespace std;  
  6. using namespace __gnu_pbds;  
  7.   
  8. template <typename T> using orderset = tree <T, null_type, less <T>, rb_tree_tag, tree_order_statistics_node_update>;  
  9.   
  10. #define ll               long long int  
  11. #define endl             '\n'  
  12.   
  13. static const int maxn = (1 << 22) + 5;  
  14.   
  15. //int dp[(1 << 22) + 5][23];  
  16. int a[maxn];  
  17. int dp[(1 << 22) + 5];  
  18.   
  19. signed main()  
  20. {  
  21.       ios_base::sync_with_stdio(false);  
  22.       cin.tie(nullptr);  
  23.       cout.tie(nullptr);  
  24.   
  25.       #ifndef ONLINE_JUDGE  
  26.             freopen("in.txt""r", stdin);  
  27.       #endif // ONLINE_JUDGE  
  28.   
  29.       int n;  
  30.       cin >> n;  
  31.       vector <int> arr(n);  
  32.       vector <int> brr(n);  
  33.       for (int &x : arr) cin >> x;  
  34.       int N = 22;  
  35.       memset(a, -1, sizeof a);  
  36.       memset(dp, -1, sizeof dp);  
  37.       for (int i = 0; i < n; i++)  
  38.       {  
  39.             int x = arr[i];  
  40.             int mask = 0;  
  41.             for (int i = 0; i < N; i++)  
  42.             {  
  43.                   bool val = (bool)(x & (1 << i));  
  44.                   if (val == 0) mask |= (1 << i);  
  45.                   else mask &= ~(1 << i);  
  46.             }  
  47.             a[x] = x;  
  48.             brr[i] = mask;  
  49.       }  
  50.       /* 
  51.       for (int mask = 0; mask < (1 << N); mask++) 
  52.       { 
  53.             for (int i = 0; i < N; i++) 
  54.             { 
  55.                   if (mask & (1 << i)) 
  56.                   { 
  57.                         if (i == 0) 
  58.                         { 
  59.                               if (a[mask] != -1) dp[mask][i] = a[mask]; 
  60.                               else if (a[mask ^ (1 << i)] != -1) dp[mask][i] = a[mask ^ (1 << i)]; 
  61.                         } 
  62.                         else 
  63.                         { 
  64.                               if (dp[mask][i - 1] != -1) dp[mask][i] = dp[mask][i - 1]; 
  65.                               else if (dp[mask ^ (1 << i)][i - 1] != -1) dp[mask][i] = dp[mask ^ (1 << i)][i - 1]; 
  66.                         } 
  67.                   } 
  68.                   else 
  69.                   { 
  70.                         if (i == 0) 
  71.                         { 
  72.                               if (a[mask] != -1) dp[mask][i] = a[mask]; 
  73.                         } 
  74.                         else 
  75.                         { 
  76.                               if (dp[mask][i - 1] != -1) dp[mask][i] = dp[mask][i - 1]; 
  77.                         } 
  78.                   } 
  79.             } 
  80.       } 
  81.       for (int i = 0; i < n; i++) cout << dp[ brr[i] ][N - 1] << " \n"[i == n - 1]; 
  82.       */  
  83.       for (int mask = 0; mask < (1 << N); mask++) dp[mask] = a[mask];  
  84.       for (int i = 0; i < N; i++)  
  85.       {  
  86.             for (int mask = 0; mask < (1 << N); mask++)  
  87.             {  
  88.                   if (mask & (1 << i) and dp[mask ^ (1 << i)] != -1) dp[mask] = dp[mask ^ (1 << i)];  
  89.             }  
  90.       }  
  91.       for (int i = 0; i < n; i++) cout << dp[ brr[i] ] << " \n"[i == n - 1];  
  92. }  

No comments:

Post a Comment

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