Submission #1359344

#TimeUsernameProblemLanguageResultExecution timeMemory
1359344jumpMountains (NOI20_mountains)C++20
100 / 100
187 ms26396 KiB
#include <bits/stdc++.h>
#define int long long
int h[300100];
int l[300100];
int r[300100];
int ans=0;
int fwk[300100];
void update(int idx){
  while(idx<=300000)fwk[idx]+=1,idx+=idx&-idx;
}
int get(int idx,int ans=0){
  while(idx>0)ans+=fwk[idx],idx-=idx&-idx;return ans;
}
std::set<int> com;
std::vector<int> comv;
signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  int n;
  std::cin >> n;
  for(int i=0;i<n;i++){
    std::cin >> h[i];
    com.insert(h[i]);
  }
  for(auto num:com)comv.push_back(num);
  for(int i=0;i<n;i++){
    h[i]=1+std::lower_bound(comv.begin(),comv.end(),h[i])-comv.begin();
  }
  for(int i=0;i<n;i++){
    l[i]=get(h[i]-1);
    update(h[i]);
  }
  for(int i=0;i<=300000;i++)fwk[i]=0;
  for(int i=n-1;i>=0;i--){
    r[i]=get(h[i]-1);
    update(h[i]);
  }
  for(int i=1;i<n-1;i++){
    ans+=l[i]*r[i];
  }
  std::cout << ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...