Submission #1345297

#TimeUsernameProblemLanguageResultExecution timeMemory
1345297tvgkExercise Deadlines (CCO20_day1problem2)C++20
25 / 25
43 ms5324 KiB
#include<bits/stdc++.h>
using namespace std;
#define task "a"
#define se second
#define fi first
#define ll long long
#define ii pair<ll, ll>
const long mxN = 2e5 + 7;

int n, a[mxN];

namespace Segment
{
    struct node
    {
        int cnt, mx;
    } tree[mxN * 4];

    node Merge(node u, node v)
    {
        u.cnt += v.cnt;
        u.mx = max(u.mx, v.mx);
        return u;
    }

    void Build(int j = 1, int l = 1, int r = n)
    {
        if (l == r)
        {
            tree[j].cnt = 1;
            tree[j].mx = a[l];
            return;
        }

        int mid = (l + r) / 2;
        Build(j * 2, l, mid);
        Build(j * 2 + 1, mid + 1, r);
        tree[j] = Merge(tree[j * 2], tree[j * 2 + 1]);
    }

    int Get(int vt, int j = 1, int l = 1, int r = n)
    {
        if (l == r)
        {
            tree[j].cnt = 0;
            tree[j].mx = 0;
            return 0;
        }

        int mid = (l + r) / 2;
        int res = 0;
        if (tree[j * 2 + 1].mx >= vt)
            res = Get(vt, j * 2 + 1, mid + 1, r);
        else
            res = tree[j * 2 + 1].cnt + Get(vt, j * 2, l, mid);
        tree[j] = Merge(tree[j * 2], tree[j * 2 + 1]);
        return res;
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    //freopen(task".INP", "r", stdin);
    //freopen(task".OUT", "w", stdout);

    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    Segment::Build();

    ll ans = 0;
    for (int i = n; i >= 1; i--)
    {
        if (Segment::tree[1].mx < i)
        {
            cout << -1;
            return 0;
        }

        ans += Segment::Get(i);
    }

    cout << ans;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...