YEZAELP

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

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