#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MOD = 1e9+7;
struct Segtree{
vector<int> s;
int sz = 1;
void init(int n){
while(sz < n)sz*=2;
s.resize(2*sz);
}
void set(int pos , int val){
pos+=sz;
s[pos] = val;
for(int p =pos/2;p>=1;p/=2){
s[p] = s[p<<1] + s[p<<1 | 1];
}
}
int query(int l , int r){
l+=sz;
r+=sz;
int res = 0;
while(l <= r){
if(l&1) res += s[l++];
if(!(r&1))res+=s[r--];
l/=2;
r/=2;
}
return res;
}
};
signed main(){
int n;cin>>n;
vector<int> a(n);
for(int i = 0 ; i < n ;i++)cin>>a[i];
vector<int> p = a;
sort(p.begin() , p.end());
unordered_map<int , int> um;
for(int i = 0 ; i < n; i++) um[p[i]] = i + 1;
Segtree st;
st.init(n+1);
for(int i = 0 ; i < n; i++) st.set(um[a[i]] , 1);
vector<int> fact(n+1);
fact[0]= 1;
for(int i = 1 ; i <= n ;i++)fact[i] = (fact[i-1]*i) % MOD;
int ans =0;
for(int i = 0 ;i < n ;i++){
int pos = um[a[i]];
int c = st.query(1 , pos - 1);
ans+= (c *fact[n - i - 1]) % MOD;
st.set(pos , 0);
}
cout<< (ans + 1) % MOD;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |