Submission #1314653

#TimeUsernameProblemLanguageResultExecution timeMemory
1314653joshjuiceCryptography (NOI20_crypto)C++20
100 / 100
177 ms9792 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int MOD = 1e9+7; const int MAXN = 3e5+5; int fact[MAXN]; struct BIT { vector<int> bit; int n; BIT(int size) { n = size + 2; bit.assign(n, 0); } void add(int index, int val) { for (; index < n; index += index & -index) bit[index] += val; } int sum(int index) { int res = 0; for (; index > 0; index -= index & -index) res += bit[index]; return res; } int query(int l, int r) { return sum(r) - sum(l - 1); } }; void compute_factorials(int n) { fact[0] = 1; for (int i = 1; i <= n; ++i) fact[i] = 1LL*fact[i-1]*i%MOD; } int32_t main() { int n; cin >> n; vector<int> p(n); for (int i = 0; i < n; ++i) cin >> p[i]; vector<int> sorted = p; sort(sorted.begin(), sorted.end()); for (int i = 0; i < n; ++i) { p[i] = lower_bound(sorted.begin(), sorted.end(), p[i])-sorted.begin()+1; } compute_factorials(n); BIT bit(n); int result = 1; for (int i = 1; i <= n; ++i) bit.add(i, 1); for (int i = 0; i < n; ++i) { int x = p[i]; int count_less = bit.sum(x - 1); result = (result+count_less*fact[n-i-1])%MOD; bit.add(x, -1); } cout << result; }
#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...