Advertisement
Guest User

Untitled

a guest
May 19th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.89 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. int arr[1000000];
  5. long long tree[4*1000000];
  6. void merge(long long &node, long long L, long long R)
  7. {
  8.     node=L+R;
  9. }
  10. void build(int node, int L, int R)
  11. {
  12.     if(L==R)
  13.     {
  14.         tree[node]=0;
  15.     }
  16.     else
  17.     {
  18.         int mid=(L+R)/2;
  19.         build(2*node,L,mid);
  20.         build(2*node+1,mid+1,R);
  21.         merge(tree[node],tree[2*node],tree[2*node+1]);
  22.     }
  23. }
  24. long long query(int node, int L, int R, int _left, int _right)
  25. {
  26.     //iLRj
  27.     if(L>=_left && R<=_right)
  28.     {
  29.         return tree[node];
  30.     }
  31.    
  32.     if(L>_right || R<_left)
  33.     {
  34.         return 0;
  35.     }
  36.     int mid=(L+R)/2;
  37.     long long left=query(2*node, L, mid, _left, _right);
  38.     long long right=query(2*node+1,mid+1,R,_left,_right);
  39.     return left+right;
  40. }
  41. void update(int node, int L, int R, int index)
  42. {
  43.     if(L==R)
  44.     {
  45.         tree[node]=1;
  46.         return;
  47.     }
  48.     int mid=(L+R)/2;
  49.     if(index>mid)
  50.     {
  51.         update(2*node+1, mid+1, R, index);
  52.     }
  53.     else
  54.     {
  55.         update(2*node, L, mid, index);
  56.     }
  57.     merge(tree[node],tree[2*node],tree[2*node+1]);
  58. }
  59. int main()
  60. {
  61.     ios_base::sync_with_stdio(false);
  62.     vector<pair<int, int> > v;
  63.         cin>>n;
  64.     int mxx = 0;
  65.     for(int i=0; i<n; i++)
  66.     {
  67.         cin>>arr[i];
  68.         v.push_back(make_pair(arr[i], i));
  69.     }
  70.     sort(v.begin(), v.end());
  71.     build(1,0,n + 1);
  72.     vector<long long> cnt1;
  73.     long long total=0;
  74.     for(int i=n-1; i>=0; i--)
  75.     {
  76.         update(1,0,n + 1,v[i].second);
  77.         cnt1.push_back(query(1,0,n + 1,0,v[i].second-1));
  78.     }
  79.     build(1, 0, n + 1);
  80.     vector<long long > cnt2;
  81.     reverse(cnt1.begin(), cnt1.end());
  82.     for(int i = 0; i < n; ++i) {
  83.         update(1, 0, n + 1, v[i].second);
  84.         total += cnt1[i] * query(1, 0, n + 1, v[i].second + 1, n + 1);
  85.     }
  86.  
  87.     cout<<total<<endl;
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement