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...