Submission #1299727

#TimeUsernameProblemLanguageResultExecution timeMemory
1299727chaitanyamehtaCryptography (NOI20_crypto)C++20
100 / 100
484 ms27816 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...