YEZAELP

PROG-1106: นับเลข (Count) (Fenwick)

Jul 9th, 2021 (edited)
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.46 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int N = 2e5 + 10;
  5. int tree[N];
  6. bool del[N];
  7. int n, k;
  8.  
  9. void Update(int pst, int val){
  10.     for(int i = pst; i <= n; i += i & -i)
  11.         tree[i] += val;
  12. }
  13.  
  14. int Sum(int pst, int sum = 0){
  15.     for(int i = pst; i > 0; i -= i & -i)
  16.         sum += tree[i];
  17.     return sum;
  18. }
  19.  
  20. int FindSum(int s, int e){
  21.     int sums = Sum(s - 1);
  22.     int sume = Sum(e);
  23.     return sume - sums;
  24. }
  25.  
  26. int FindIndex(int s, int e, int x){
  27.     int mn = e + 1, l = s, r = e;
  28.     while(l <= r){
  29.         int mid = (l + r) / 2;
  30.         int sum = FindSum(s, mid);
  31.         if(sum >= x){
  32.             mn = min(mn, mid);
  33.             r = mid - 1;
  34.         }
  35.         else
  36.             l = mid + 1;
  37.     }
  38.     return mn;
  39. }
  40.  
  41. int main(){
  42.  
  43.     scanf("%d%d", &n, &k);
  44.  
  45.     for(int i=1;i<=n;i++)
  46.         Update(i, 1);
  47.  
  48.     int cur = 0, srch, sum;
  49.     for(int sz=n;sz>1;sz--){
  50.         /// search
  51.         if(cur != 0) k = cur;
  52.         if(k % sz == 0) srch = sz;
  53.         else srch = k % sz;
  54.  
  55.         /// sum
  56.         sum = 0;
  57.         if(cur != n) sum = FindSum(cur + 1, n);
  58.  
  59.         /// find index
  60.         if(sum >= srch) cur = FindIndex(cur + 1, n, srch);
  61.         else cur = FindIndex(1, cur - 1, srch - sum);
  62.  
  63.         /// update index
  64.         del[cur] = true;
  65.         Update(cur, -1);
  66.     }
  67.  
  68.     for(int i=1;i<=n;i++){
  69.         if(!del[i]){
  70.             printf("%d", i);
  71.             return 0;
  72.         }
  73.     }
  74.  
  75.     return 0;
  76. }
Add Comment
Please, Sign In to add comment