Untitled
user_5668965
c_cpp
a year ago
1.7 kB
8
Indexable
#include<bits/stdc++.h> using namespace std; #define fast ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); #define int long long struct BIT { vector<int> bit; // binary indexed tree int n; BIT(int n) { this->n = n; bit.assign(n, 0); } BIT(vector<int> a) : BIT(a.size()) { for (size_t i = 0; i < a.size(); i++) add(i, a[i]); } int sum(int r) { int ret = 0; for (; r >= 0; r = (r & (r + 1)) - 1) ret += bit[r]; return ret; } int sum(int l, int r) { return sum(r) - sum(l - 1); } void add(int idx, int delta) { for (; idx < n; idx = idx | (idx + 1)) bit[idx] += delta; } }; void solve(){ int n; cin>>n; int a[n]={}; set<int> st; for(int i=0;i<n;i++) cin>>a[i],st.insert(a[i]); int cnt=1; map<int,int> mapi; for(auto &it:st){ mapi[it]=cnt++; } for(int i=0;i<n;i++) a[i]=mapi[a[i]]; int lefti[n]={}; BIT b1(cnt+5); for(int i=n-1;i>=0;i--){ lefti[i]=b1.sum(a[i]-1); b1.add(a[i],1); } reverse(a,a+n); int righti[n]={}; BIT b2(cnt+5); for(int i=n-1;i>=0;i--){ righti[i]=b2.sum(a[i]+1,cnt+3); b2.add(a[i],1); } reverse(righti,righti+n); int ans=0; for(int i=0;i<n;i++){ ans+=(lefti[i]*righti[i]); } cout<<ans<<'\n'; } signed main() { #ifndef ONLINE_JUDGE freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif fast int t=1; //cin>>t; while(t--) solve(); return 0; }
Editor is loading...
Leave a Comment