Monday, December 10, 2018

[Spoj] ASCDFIB – Ascending Fibonacci Numbers

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : ASCDFIB – Ascending Fibonacci Numbers
Source            : Spoj
Category          : Data Structure
Algorithm         : Wavelet Tree
Verdict           : Accepted
  1. #include "bits/stdc++.h"  
  2.    
  3. using namespace std;  
  4.    
  5. #define ll         long long  
  6.    
  7. static const int maxn = 1100000 + 5;  
  8. static const int mod = 1e5;  
  9.    
  10. struct wavelet_tree  
  11. {  
  12.       #define vi          vector <int>  
  13.       #define pb          push_back  
  14.    
  15.       int lo, hi;  
  16.       wavelet_tree *l, *r;  
  17.       vi b;  
  18.       wavelet_tree(int *from, int *to, int x, int y)  
  19.       {  
  20.             lo = x;  
  21.             hi = y;  
  22.             if (lo == hi || from >= to) return;  
  23.             int mid = (lo + hi) >> 1;  
  24.             auto f = [mid](int x)  
  25.             {  
  26.                   return x <= mid;  
  27.             };  
  28.             b.reserve(to - from + 1);  
  29.             b.pb(0);  
  30.             for (auto it = from; it != to; it++)  
  31.             {  
  32.                   b.pb(b.back() + f(*it));  
  33.             }  
  34.             auto pivot = stable_partition(from, to, f);  
  35.             l = new wavelet_tree(from, pivot, lo, mid);  
  36.             r = new wavelet_tree(pivot, to, mid + 1, hi);  
  37.       }  
  38.       // kth smallest element in [l, r]  --- 1 indexed  
  39.  int kth(int l, int r, int k)  
  40.       {  
  41.             if (l > r) return 0;  
  42.             if (lo == hi) return lo;  
  43.             int lb = b[l-1];  
  44.             int rb = b[r];  
  45.             int inLeft = rb - lb;  
  46.             if (k <= inLeft) return this->l->kth(lb + 1, rb, k);  
  47.             else return this->r->kth(l - lb, r - rb, k - inLeft);  
  48.     }  
  49.     ~wavelet_tree()  
  50.     {  
  51.         delete l;  
  52.         delete r;  
  53.     }  
  54. };  
  55.    
  56. int fibo[maxn], temp[maxn];  
  57.    
  58. inline void fibonacci_series()  
  59. {  
  60.       fibo[1] = 0; temp[1] = fibo[1];  
  61.       fibo[2] = 1; temp[2] = fibo[2];  
  62.       for (int i = 3; i < maxn; i++)  
  63.       {  
  64.             fibo[i] = fibo[i-1] + fibo[i-2];  
  65.             if (fibo[i] >= mod) fibo[i] -= mod;  
  66.             temp[i] = fibo[i];  
  67.       }  
  68. }  
  69.    
  70. int main()  
  71. {  
  72.       fibonacci_series();  
  73.       wavelet_tree *T;  
  74.       T = new wavelet_tree(temp+1, temp+maxn+1, 0, 100000+1);  
  75.       int tc;  
  76.       scanf("%d", &tc);  
  77.       for (int tcase = 1; tcase <= tc; tcase++)  
  78.       {  
  79.             int A, B;  
  80.             scanf("%d %d", &A, &B);  
  81.             int maxlen = min(100, B + 1);  
  82.             printf("Case %d: ", tcase);  
  83.             for (int i = 1; i <= maxlen; i++)  
  84.             {  
  85.                   int kth = T->kth(A, A+B, i);  
  86.                   printf("%d", kth);  
  87.                   if (i == maxlen) puts("");  
  88.                   else printf(" ");  
  89.             }  
  90.       }  
  91. }  

No comments:

Post a Comment

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