Advertisement
shamiul93

LightOJ - 1080 - Binary Simulation

Apr 30th, 2017
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.74 KB | None | 0 0
  1. /**
  2. @author - Rumman BUET CSE'15
  3. Problem - 1080 - Binary Simulation
  4.  
  5. DIfficulty Level - easy one.
  6. AC in one go.
  7.  
  8. Concept - Seg tree , LP
  9.  
  10. Has similarity with MULTQ3 of SPOJ. If you can solve that you can do it more easily.
  11. It has an almost twin in SPOJ - LITE SWITCH.
  12.  
  13. 30/4/2017
  14.  
  15. */
  16.  
  17.  
  18. #include <bits/stdc++.h>
  19. #define ll                                      long long
  20. #define fi                                      freopen("in.txt", "r", stdin)
  21. #define fo                                      freopen("out.txt", "w", stdout)
  22. #define m0(a) memset(a , 0 , sizeof(a))
  23. #define m1(a) memset(a , -1 , sizeof(a))
  24.  
  25. #define mx 100009
  26. using namespace std;
  27.  
  28.  
  29. class node
  30. {
  31. public:
  32.     ll one, zero, prop ;
  33.     node()
  34.     {
  35.         one = 0 ;
  36.         zero = 0 ;
  37.         prop = 0 ;
  38.     }
  39.     node(ll a, ll b)
  40.     {
  41.         one = a ;
  42.         zero = b ;
  43.         prop = 0 ;
  44.     }
  45. };
  46.  
  47. ll N, i, j, idx  ;
  48. char str[mx] = {} ;
  49. node seg[mx*4] = {} ;
  50.  
  51.  
  52. node build(ll lo, ll hi, ll sp)
  53. {
  54.     if(lo == hi)
  55.     {
  56.         if(str[lo] == '1')
  57.         {
  58.             seg[sp] = node(1,0);
  59.         }
  60.         else
  61.         {
  62.             seg[sp] = node(0,1);
  63.         }
  64.         return seg[sp] ;
  65.     }
  66.  
  67.     ll mid ;
  68.     mid = (lo + hi) / 2 ;
  69.  
  70.     node l, r ;
  71.     l = build(lo, mid, 2*sp+1) ;
  72.     r = build(mid+1, hi, 2*sp+2) ;
  73.  
  74.     seg[sp].zero = l.zero + r.zero ;
  75.     seg[sp].one = l.one + r.one ;
  76.  
  77.     return seg[sp] ;
  78. }
  79.  
  80. node propagate(node a, ll x)
  81. {
  82.     a.prop += x ;
  83.     swap(a.zero, a.one) ;
  84.     return a ;
  85. }
  86.  
  87. node loopPropagate(node a, ll x)
  88. {
  89.     for(ll k = 0 ; k < x ; k++)
  90.     {
  91.         swap(a.zero, a.one) ;
  92.     }
  93.     return a ;
  94. }
  95.  
  96. node update(ll lo, ll hi, ll sp, ll x)
  97. {
  98.     if(lo > j || hi < i)
  99.     {
  100.         return node(0,0) ;
  101.     }
  102.     if(lo >= i && hi <= j)
  103.     {
  104.         seg[sp] = propagate(seg[sp], x) ;
  105.         return seg[sp] ;
  106.     }
  107.  
  108.     ll mid ;
  109.     mid = (lo + hi) / 2 ;
  110.  
  111.     update(lo, mid, 2*sp+1, x) ;
  112.     update(mid+1, hi, 2*sp+2, x) ;
  113.  
  114.     seg[sp].zero = seg[2*sp+1].zero + seg[2*sp+2].zero ;
  115.     seg[sp].one = seg[2*sp+1].one + seg[2*sp+2].one ;
  116.  
  117.     seg[sp] = loopPropagate(seg[sp], x%2) ;
  118.     return seg[sp] ;
  119. }
  120.  
  121. ll query(ll lo, ll hi, ll sp, ll carry)
  122. {
  123.     if(lo > idx || hi < idx)
  124.     {
  125.         return 0 ;
  126.     }
  127.     if(lo >= idx && hi <= idx)
  128.     {
  129.         node n ;
  130.         n = loopPropagate(seg[sp], carry%2) ;
  131.         if(n.zero == 0)
  132.         {
  133.             return 1 ;
  134.         }
  135.         else
  136.         {
  137.             return 0 ;
  138.         }
  139.     }
  140.     ll mid ;
  141.     mid = (lo + hi) / 2 ;
  142.     ll l, r ;
  143.     l = query(lo, mid, 2*sp+1, carry + seg[sp].prop) ;
  144.     r = query(mid+1, hi, 2*sp+2, carry + seg[sp].prop) ;
  145.  
  146.     return l+r ;
  147. }
  148.  
  149.  
  150. int main()
  151. {
  152. //    fi ;
  153. //    fo ;
  154.     ll T, t = 0 ;
  155.     scanf("%lld",&T) ;
  156.  
  157.     while(T--)
  158.     {
  159.         for(ll k = 0 ; k < mx ; k++)
  160.         {
  161.             str[k] = '\0' ;
  162.         }
  163.         for(ll k = 0 ; k < mx*4 ; k++)
  164.         {
  165.             seg[k].zero = 0 ;
  166.             seg[k].one = 0 ;
  167.             seg[k].prop = 0 ;
  168.         }
  169.  
  170.         ll q ;
  171.         t++ ;
  172.         printf("Case %lld:\n",t);
  173.         scanf(" %s",str) ;
  174.         scanf("%lld",&q) ;
  175.         N = strlen(str) ;
  176.         build(0, N-1, 0) ;
  177.         while(q--)
  178.         {
  179.             char c ;
  180.             scanf(" %c",&c) ;
  181.             if(c == 'I')
  182.             {
  183.                 scanf("%lld %lld",&i, &j) ;
  184.                 i-- ;
  185.                 j-- ;
  186.                 update(0,N-1, 0,1);
  187.             }
  188.             else
  189.             {
  190.                 scanf("%lld",&idx) ;
  191.                 idx -- ;
  192.                 ll ans ;
  193.                 ans = query(0,N-1, 0,0) ;
  194.                 printf("%lld\n",ans) ;
  195.             }
  196.         }
  197.     }
  198.     return 0 ;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement