제출 #766994

#제출 시각아이디문제언어결과실행 시간메모리
766994Tenis0206Exercise Deadlines (CCO20_day1problem2)C++11
25 / 25
110 ms13432 KiB
#include <bits/stdc++.h>

using namespace std;

const int nmax = 2e5;

int n;
int v[nmax + 5];

int poz[nmax + 5];

set<int,greater<int>> s;

int aib[nmax + 5];

int ub(int x)
{
    return (x & (-x));
}

void update(int poz, int val)
{
    for(int i=poz;i<=n;i+=ub(i))
    {
        aib[i] += val;
    }
}

int query(int qa, int qb)
{
    int rez = 0;
    for(int i=qb;i>=1;i-=ub(i))
    {
        rez += aib[i];
    }
    for(int i=qa-1;i>=1;i-=ub(i))
    {
        rez -= aib[i];
    }
    return rez;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i];
        s.insert(i);
    }
    for(int i=n;i>=1;i--)
    {
        auto it = s.lower_bound(v[i]);
        if(it==s.end())
        {
            cout<<-1<<'\n';
            return 0;
        }
        poz[i] = *it;
        s.erase(it);
    }
    long long rez = 0;
    for(int i=1;i<=n;i++)
    {
        rez += query(poz[i], n);
        update(poz[i],+1);
    }
    cout<<rez<<'\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...