이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
int ft[300005];
pair<int, int> d[300005];
int n;
int ls(int x){
return x & (-x);
}
void update(int p, int v){
for(;p<=n;p+=ls(p)){
ft[p] += v;
}
}
void update1(int p){
for(;p<=n;p+=ls(p))ft[p] = 0;
}
int query(int p){
int sum = 0;
for(;p;p-=ls(p)){
sum += ft[p];
}
return sum;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
cin >> n;
int arr[n+1];
long long f[n+1];
f[1] = 1;
f[0] = 0;
for(int i=1;i<=n;i++)cin >> arr[i];
for(int i=1;i<=n;i++)update(i, 1);
for(int i=2;i<=n;i++)f[i] = (i * f[i-1])%1000000007;
for(int i = 1; i <= n; i++){
d[i].first = arr[i];
d[i].second = i;
}
sort(d + 1, d + n + 1);
int cnt2 = 1;
for(int i = 1; i <= n; i++){
if (i > 1 && d[i].first != d[i-1].first) cnt2++;
arr[d[i].second] = cnt2;
}
long long cnt = 1;
for(int i=1;i<=n;i++){
int e = arr[i];
cnt += f[n-i] * (query(e)- 1);
cnt %= 1000000007;
update(e, -1);
}
cout << cnt;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |