Saturday, November 2, 2019

[Codeforces] F. Daniel and Spring Cleaning

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : F. Daniel and Spring Cleaning
Source            : Codeforces
Category          : Dynamic Programing
Algorithm         : Digit DP, A-B
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. long long dp[32][2][2][2][2];  
  6. bool memoize[32][2][2][2][2];  
  7. string a;  
  8. string b;  
  9.   
  10. long long solve(int pos, bool small1, bool large1, bool small2, bool large2)  
  11. {  
  12.       if (pos < 0) return 1;  
  13.       long long &ret = dp[pos][small1][large1][small2][large2];  
  14.       bool &mem = memoize[pos][small1][large1][small2][large2];  
  15.       if (mem) return ret;  
  16.       mem = 1;  
  17.       long long sum = 0;  
  18.       int numa = a[pos] - '0';  
  19.       int numb = b[pos] - '0';  
  20.       for (int i = 0; i <= 1; i++)  
  21.       {  
  22.             if (small1 == 0 and i > numb) continue;  
  23.             if (large1 == 0 and i < numa) continue;  
  24.             for (int j = 0; j <= 1; j++)  
  25.             {  
  26.                   if (small2 == 0 and j > numb) continue;  
  27.                   if (large2 == 0 and j < numa) continue;  
  28.                   if (i & j) continue;  
  29.                   bool nsmall1 = small1 | (i < numb);  
  30.                   bool nlarge1 = large1 | (i > numa);  
  31.                   bool nsmall2 = small2 | (j < numb);  
  32.                   bool nlarge2 = large2 | (j > numa);  
  33.                   sum += solve(pos - 1, nsmall1, nlarge1, nsmall2, nlarge2);  
  34.             }  
  35.       }  
  36.       return ret = sum;  
  37. }  
  38.   
  39. long long digit_dp(int l, int r)  
  40. {  
  41.       a.clear();  
  42.       b.clear();  
  43.       for (int i = 0; i < 31; i++)  
  44.       {  
  45.             a.push_back((l % 2) + '0');  
  46.             b.push_back((r % 2) + '0');  
  47.             l /= 2;  
  48.             r /= 2;  
  49.       }  
  50.       memset(memoize, 0, sizeof memoize);  
  51.       return solve(30, 0, 0, 0, 0);  
  52. }  
  53.   
  54. signed main()  
  55. {  
  56.       ios_base::sync_with_stdio(false);  
  57.       cin.tie(nullptr);  
  58.       cout.tie(nullptr);  
  59.   
  60.       #ifndef ONLINE_JUDGE  
  61.             freopen("in.txt""r", stdin);  
  62.       #endif // ONLINE_JUDGE  
  63.   
  64.       int tc;  
  65.       cin >> tc;  
  66.       while (tc--)  
  67.       {  
  68.             int l, r;  
  69.             cin >> l >> r;  
  70.             cout << digit_dp(l, r) << '\n';  
  71.       }  
  72. }  

No comments:

Post a Comment

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