제출 #854080

#제출 시각아이디문제언어결과실행 시간메모리
854080The_SamuraiMoney (IZhO17_money)C++17
100 / 100
118 ms15224 KiB
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
const int inf = 1e9;
const int N = 1e6 + 5;

struct SegTree {
    vector<int> tree;
    int size;

    void init(int n) {
        size = 1;
        while (size < n) size <<= 1;
        tree.assign(2 * size, 0);
    }

    void update(int i, int v, int x, int l, int r) {
        if (r - l == 1) {
            tree[x] += v;
            return;
        }
        int m = (l + r) >> 1;
        if (i < m) update(i, v, x << 1, l, m);
        else update(i, v, x << 1 | 1, m, r);
        tree[x] = tree[x << 1] + tree[x << 1 | 1];
    }

    void update(int i, int v) {
        assert(i < size);
        update(i, v, 1, 0, size);
    }

    int find_bigger(int k, int x, int l, int r) {
        if (r - l == 1) return l;
        int m = (l + r) >> 1;
        if (tree[x << 1] >= k) return find_bigger(k, x << 1, l, m);
        else return find_bigger(k - tree[x << 1], x << 1 | 1, m, r);
    }

    int find_bigger(int k) {
        return find_bigger(k, 1, 0, size);
    }
};

struct Fenwick {
    vector<int> tree;
    int len;

    void init(int n) {
        len = n;
        tree.assign(len + 1, 0);
    }

    void update(int i, int v) {
        i++;
        while (i <= len) {
            tree[i] += v;
            i += i & (-i);
        }
    }

    int get(int i) {
        i++;
        int sum = 0;
        while (i > 0) {
            sum += tree[i];
            i -= i & (-i);
        }
        return sum;
    }


    int get(int l, int r) {
        return get(r) - get(l - 1);
    }
};

int main() {
    cin.tie(0)->sync_with_stdio(false);
#ifdef sunnatov
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif

    int n;
    cin >> n;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++) cin >> a[i];
    Fenwick fw; fw.init(N);
    int cnt = 1;
    for (int l = 1, r = 2; r <= n; r++) {
        if (a[r] < a[r - 1]) {
            for (int i = l; i < r; i++) fw.update(a[i], 1);
            l = r;
            cnt++;
            continue;
        }
        int lx = fw.get(a[l]), rx = fw.get(a[r] - 1) + 1;
        if (rx - lx > 1) {
            for (int i = l; i < r; i++) fw.update(a[i], 1);
            l = r;
            cnt++;
        }
    }
    cout << cnt;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...