Submission #1065928

#TimeUsernameProblemLanguageResultExecution timeMemory
1065928Shadow1Cryptography (NOI20_crypto)C++17
100 / 100
298 ms31684 KiB
// Programmer: Shadow1 #include <bits/stdc++.h> // #include <ext/pb_ds/assoc_container.hpp> // #include <ext/pb_ds/tree_policy.hpp> using namespace std; using ll = long long; using ld = long double; using ull = unsigned long long; using str = string; // yay python! #define i64 int64_t #define show(x) cerr << (#x) << " = " << (x) << '\n'; #define output_vector(v) for(auto &x : v){cout << x << ' ';}cout << '\n'; #define output_pairvector(v) for(auto &x : v){cout << x.first << " " << x.second << '\n';} #define vt vector #define pq priority_queue #define pb push_back #define eb emplace_back #define pii pair<int,int> #define umap unordered_map #define uset unordered_set #define fir first #define sec second #define sz(x) ll(x.size()) #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define int ll #define discretize(x) sort(x.begin(), x.end()); x.erase(unique(x.begin(), x.end()), x.end()); // T: O(n^3) // M : O(n + k log n) const int mxN = 50005, INF = 2e9; vector<int64_t> ft; int lsb(int x) { return (x & (-x)); } void build(const vector<int64_t> &f) { // Build the fenwick tree array from the frequency array int m = sz(f) - 1; ft.resize(m+1); for(int i=1; i<=m; ++i) { ft[i] += f[i]; if(i + lsb(i) <= m) ft[i+lsb(i)] += ft[i]; } } int64_t query(int i, int j) { // i <= j // O(log m) int64_t sum = 0; while(j > 0) { sum += ft[j]; j -= lsb(j); } --i; while(i > 0) { sum -= ft[i]; i -= lsb(i); } return sum; } void update(int i, int64_t v) { for(; i<sz(ft); i+=lsb(i)) // O(log m) ft[i] += v; } const int m = 1e9 + 7; void solve() { int n; cin >> n; vector<int> a(n+1), fact(n+1), s(n+1); map<int,int> r; for(int i=1; i<=n; ++i) { cin >> a[i]; s[i] = a[i]; } sort(all(s)); for(int i=1; i<=n; ++i) r[s[i]] = i; fact[0] = 1; for(int i=1; i<=n; ++i) { fact[i] = fact[i-1] * i; fact[i] %= m; } ft.assign(n+2, 0); update(r[a[n]], 1); int ans = 1; for(int i=n-1; i; --i) { int cnt = query(1, r[a[i]]-1); ans += (cnt * fact[n-i]) % m; ans %= m; update(r[a[i]], 1); } cout << ans << '\n'; } signed main() { // freopen("output.txt", "w", stdout); // freopen("input.txt", "r", stdin); ios::sync_with_stdio(false); cin.tie(NULL); int T = 1; // cin >> T; while(T--) solve(); return 0; } /* CHECK : 1. COMPARATOR FUNCTION MUST RETURN FALSE WHEN ARGUMENTS ARE EQUAL!!! 2. Overflow! Typecase int64_t on operations if varaibles are int 3. Check array bounds!!! 4. Check array indexing!!! 5. Edge cases. (N==1)!!! */
#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...