DuongNhi99

NKINV (Segment Tree)

Mar 10th, 2022
520
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.11 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 60001;
  5.  
  6. int n;
  7. int a[N], st[N * 5];
  8.  
  9. void update(int id, int l, int r, int u, int v, int val)
  10. {
  11.     if (v < l || r < u) return;
  12.    
  13.     if (u <= l && r <= v) {
  14.         st[id] += val;
  15.         return;
  16.     }
  17.    
  18.     int mid = (l+r) / 2;
  19.     update(id * 2, l, mid, u, v, val);
  20.     update(id * 2 + 1, mid + 1, r, u, v, val);
  21.    
  22.     st[id] = st[id*2] + st[id*2+1];
  23. }
  24.  
  25. int get(int id, int l, int r, int u, int v)
  26. {
  27.     if (v < l || r < u) return 0;
  28.    
  29.     if (u <= l && r <= v)
  30.         return st[id];
  31.    
  32.     int mid = (l+r) / 2;
  33.     int t1 = get(id * 2, l, mid, u, v);
  34.     int t2 = get(id * 2 + 1, mid + 1, r, u, v);
  35.    
  36.     return t1 + t2;
  37. }
  38.  
  39. int main()
  40. {
  41.     cin >> n;
  42.     int m = 0;
  43.     for (int i = 1; i <= n; i++) {
  44.         cin >> a[i];
  45.         m = max(m, a[i]);
  46.     }
  47.    
  48.     int ans = 0;
  49.     for(int i = n; i >= 1; i--) {
  50.         int t = get(1, 1, m, 1, a[i]-1);
  51.         ans = ans + t;
  52.         update(1, 1, m, a[i], a[i], 1);
  53.     }
  54.    
  55.     cout << ans;
  56. }
  57. /*
  58. Cho một dãy số a1.. aN.
  59. Một nghịch thế là một cặp số u, v sao cho u < v và au > av.
  60. Nhiệm vụ của bạn là đếm số nghịch thế.
  61. 3
  62. 3 1 2
  63. -> 2
  64. */
Advertisement
Add Comment
Please, Sign In to add comment