pranavsindura

Untitled

Jan 7th, 2024
910
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. const int MAXN = 1e4 + 5;
  5. const int MOD = 1e9;
  6.  
  7. int tree[4 * MAXN];
  8.  
  9. int query(int v, int tl, int tr, int l, int r) {
  10.   if (l > r)
  11.     return 0;
  12.   if (tl == l && r == tr)
  13.     return tree[v];
  14.  
  15.   int tm = (tl + tr) >> 1;
  16.   int L = query(v << 1, tl, tm, l, min(r, tm));
  17.   int R = query(v << 1 | 1, tm + 1, tr, max(tm + 1, l), r);
  18.  
  19.   return L + R;
  20. }
  21.  
  22. void update(int v, int tl, int tr, int pos) {
  23.   if (tl == tr)
  24.     tree[v]++;
  25.   else {
  26.     int tm = (tl + tr) >> 1;
  27.     if (pos <= tm) {
  28.       update(v << 1, tl, tm, pos);
  29.     } else {
  30.       update(v << 1 | 1, tm + 1, tr, pos);
  31.     }
  32.     tree[v] = tree[v << 1] + tree[v << 1 | 1];
  33.   }
  34. }
  35.  
  36. int solve(vector<int> &T) {
  37.   int ans = 0;
  38.   vector<int> freq(MAXN, 0), mul(MAXN, 0);
  39.  
  40.   memset(tree, 0, sizeof tree);
  41.  
  42.   for (int x : T)
  43.     freq[x]++;
  44.  
  45.   for (int i = 0; i < MAXN; i++)
  46.     mul[i] = (freq[i] * i) % MOD;
  47.  
  48.   for (int i = 1; i < MAXN; i++)
  49.     freq[i] = (freq[i] + freq[i - 1]) % MOD;
  50.  
  51.   for (int i = 1; i < MAXN; i++)
  52.     mul[i] = (mul[i] + mul[i - 1]) % MOD;
  53.  
  54.   for (int i = T.size() - 1; i >= 0; i--) {
  55.     // all less than T[i] summed
  56.     ans += mul[T[i] - 1];
  57.     ans %= MOD;
  58.  
  59.     // all greater than or equal to T[i]
  60.     ans += T[i] * (freq[MAXN - 1] - freq[T[i] - 1]);
  61.     ans %= MOD;
  62.  
  63.     // remove those on the right
  64.     int on_right = query(1, 0, MAXN - 1, T[i], MAXN - 1);
  65.     ans -= on_right;
  66.     ans += MOD;
  67.     ans %= MOD;
  68.  
  69.     update(1, 0, MAXN - 1, T[i]);
  70.   }
  71.  
  72.   return ans;
  73. }
  74.  
  75. int main() {
  76.   int N;
  77.   cin >> N;
  78.   vector<int> A(N);
  79.   for (int &x : A) {
  80.     cin >> x;
  81.   }
  82.  
  83.   int ans = solve(A);
  84.   cout << ans << endl;
  85. }
  86.  
Advertisement
Add Comment
Please, Sign In to add comment