Submission #1323874

#TimeUsernameProblemLanguageResultExecution timeMemory
1323874tripleabatteryCryptography (NOI20_crypto)C++20
100 / 100
232 ms19212 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;

ll MOD= 1000000007;
const ll MAXN=3e5+5;
vector<ll> st(4*MAXN);

void update(ll x, ll y, ll d=1, ll l=1, ll r=MAXN)
{
    if(l>x||r<x)return;
    if(l==r)
    {
        st[d]=y;
        return;
    }
    ll m=(l+r)/2;
    update(x,y,2*d,l,m);
    update(x,y,2*d+1,m+1,r);
    st[d]=st[2*d]+st[2*d+1];
}

ll query(ll x, ll y, ll d=1, ll l=1, ll r=MAXN)
{
    if(l>y||r<x)return 0;
    if(l>=x&&r<=y)
    {
        return st[d];
    }
    ll m=(l+r)/2;
    ll mew1=query(x,y,2*d,l,m);
    ll mew2=query(x,y,2*d+1,m+1,r);
    return mew1+mew2;
}

int main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    ll n; cin>>n;
    vector<ll> p(n+1);
    vector<ll> a(n+1);
    vector<ll> ps(n+1),fct(n+1);
    fct[0]=1;
    for(ll i=1;i<=n;i++)cin>>p[i],ps[i]=p[i],fct[i]=(fct[i-1]*i)%MOD;
    for(ll i=1;i<=n;i++)update(i,1);
    sort(ps.begin()+1,ps.begin()+n+1);
    for(ll i=1;i<=n;i++)
    {
        ll idx=lower_bound(ps.begin()+1,ps.begin()+n+1,p[i])-ps.begin();
        a[i]=idx;
    }
    ll ans=1;
    for(ll i=1;i<=n;i++)
    {
        ans=(ans+(query(1,a[i]-1)*fct[n-i])%MOD)%MOD;
        update(a[i],0);
    }
    cout<<ans%MOD<<"\n";
}
#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...