Submission #1299727

#TimeUsernameProblemLanguageResultExecution timeMemory
1299727chaitanyamehtaCryptography (NOI20_crypto)C++20
100 / 100
484 ms27816 KiB
#include<bits/stdc++.h> using namespace std; #define int long long const int MOD = 1e9+7; struct Segtree{ vector<int> s; int sz = 1; void init(int n){ while(sz < n)sz*=2; s.resize(2*sz); } void set(int pos , int val){ pos+=sz; s[pos] = val; for(int p =pos/2;p>=1;p/=2){ s[p] = s[p<<1] + s[p<<1 | 1]; } } int query(int l , int r){ l+=sz; r+=sz; int res = 0; while(l <= r){ if(l&1) res += s[l++]; if(!(r&1))res+=s[r--]; l/=2; r/=2; } return res; } }; signed main(){ int n;cin>>n; vector<int> a(n); for(int i = 0 ; i < n ;i++)cin>>a[i]; vector<int> p = a; sort(p.begin() , p.end()); unordered_map<int , int> um; for(int i = 0 ; i < n; i++) um[p[i]] = i + 1; Segtree st; st.init(n+1); for(int i = 0 ; i < n; i++) st.set(um[a[i]] , 1); vector<int> fact(n+1); fact[0]= 1; for(int i = 1 ; i <= n ;i++)fact[i] = (fact[i-1]*i) % MOD; int ans =0; for(int i = 0 ;i < n ;i++){ int pos = um[a[i]]; int c = st.query(1 , pos - 1); ans+= (c *fact[n - i - 1]) % MOD; st.set(pos , 0); } cout<< (ans + 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...