Submission #1268189

#TimeUsernameProblemLanguageResultExecution timeMemory
1268189aryanCryptography (NOI20_crypto)C++20
100 / 100
135 ms6284 KiB
#include<bits/stdc++.h> using namespace std; using i64 = long long; const int mod = 1e9 + 7; using i64 = long long; template <class T> struct fenwick{ int N; vector<T> tree; fenwick(int _n){ N = _n; tree = vector<T>(N + 1); } void update(int i,T v){ for(++ i;i <= N;i += (i & -i)){ tree[i] += v; } } T query(int i){ T val = 0; for(++ i;i > 0;i -= (i & -i)){ val += tree[i]; } return val; } }; int main(){ int n; cin >> n; vector<int> fact(n + 1,1); vector<int> idx(n); for(int i = 1;i <= n;i++){ fact[i] = (fact[i - 1] * 1LL * i) % mod; } vector<int> a(n); for(int i = 0;i < n;i++){ cin >> a[i]; } iota(idx.begin(),idx.end(),0); sort(idx.begin(),idx.end(),[&](int i,int j){ return a[i] < a[j]; }); for(int i = 0;i < n;i++){ a[idx[i]] = i + 1; } fenwick<int> fen(n + 1); vector<int> le(n); for(int i = 0;i < n;i++){ fen.update(a[i],1); le[i] = fen.query(a[i] - 1); } int ans = 0; for(int i = 0;i < n - 1;i++){ int totb = a[i] - 1 - le[i]; assert(totb >= 0); ans += (fact[n - i - 1] * 1LL * totb) % mod; ans %= mod; } ans ++; ans %= mod; cout << ans << '\n'; return 0; }
#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...