Submission #826493

#TimeUsernameProblemLanguageResultExecution timeMemory
826493nasir_bashirovCryptography (NOI20_crypto)C++11
100 / 100
387 ms31404 KiB
#include "bits/stdc++.h"
using namespace std;

#define int long long

#define endl '\n'
#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#define vi vector<int>
#define vl vector<ll>
#define vii vector<pii>
#define vll vector<pll>
#define all(x)    x.begin(), x.end()
#define fastio\
    ios_base::sync_with_stdio(0);\
    cin.tie(0);\
    cout.tie(0)\

const int sz = 3e5 + 5;
ll a[sz], b[sz], f[sz], n, ind;
const int mod = 1e9 + 7;
map<int, int> mp;

struct fenwickTree{
    int n;
    vi BIT;
    fenwickTree(int sz){
        n = sz;
        BIT.resize(n + 1, 0);
    }
    void update(int i, int v){
        if(i == 0)    return;
        while(i <= n){
            BIT[i] += v;
            i += i & (-i);
        }
    }
    int query(int l, int r){
        if(l > r)   return 0;   
        if(l != 1)    return query(1, r) - query(1, l - 1);
        int res = 0;
        while(r > 0){
            res += BIT[r];
            r -= r & (-r);
        }
        return res;
    }
};

void preComp(){
    f[0] = 1;
    for(ll i = 1; i <= 300000; i++){
        f[i] = f[i - 1] * i % mod;
    }
}

signed main(){
    fastio;
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        b[i] = a[i];
    }
    sort(b + 1, b + n + 1);
    for(int i = 1; i <= n; i++){
        mp[b[i]] = ++ind;
    }
    for(int i = 1; i <= n; i++){
        a[i] = mp[a[i]];
    }
    ll res = 0;
    fenwickTree t(n);
    for(int i = 1; i <= n; i++){
        t.update(i, 1);
    }
    preComp();
    for(int i = 1; i <= n; i++){
        res += f[n - i] * (t.query(1, a[i] - 1)) % mod;
        res %= mod;
        t.update(a[i], -1);
    }
    cout << (res + 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...