제출 #1170200

#제출 시각아이디문제언어결과실행 시간메모리
1170200Hamed_GhaffariFinancial Report (JOI21_financial)C++20
100 / 100
439 ms25684 KiB
#include <bits/stdc++.h>
using namespace std;

using pii = pair<int, int>;

#define X first
#define Y second
#define maxs(a,b) (a=max(a,b))
#define lc id<<1
#define rc lc|1
#define mid ((l+r)>>1)
#define pb push_back
#define all(x) x.begin(), x.end()
#define Mp make_pair

const int MXN = 3e5+5;

struct node {
    int pre, suf, ans;
    bool full;
    node(bool x=0): pre(x), suf(x), ans(x), full(x) {}
} seg[MXN<<2];
node operator+(node x, node y) {
    node res;
    res.pre = x.pre + (x.full ? y.pre : 0);
    res.suf = y.suf + (y.full ? x.suf : 0);
    res.ans = max({x.ans, y.ans, x.suf+y.pre});
    res.full = x.full&y.full;
    return res;
}
int n, d, a[MXN], ord[MXN], mx[MXN<<2];

void build(int l=0, int r=n, int id=1) {
    if(r-l == 1) {
        seg[id] = node(1);
        return;
    }
    build(l, mid, lc);
    build(mid, r, rc);
    seg[id] = seg[lc] + seg[rc];
}
void upd1(int p, int l=0, int r=n, int id=1) {
    if(r-l == 1) {
        seg[id] = seg[0];
        return;
    }
    p<mid ? upd1(p, l, mid, lc) : upd1(p, mid, r, rc);
    seg[id] = seg[lc] + seg[rc];
}
pair<int, node> find(int e, int l=0, int r=n, int id=1, node cur=seg[0]) {
    if(l>=e) return {l, cur};
    if(r<=e) {
        if((seg[id]+cur).ans<d) return {l, seg[id]+cur};
        if(r-l == 1) return {r, cur};
    }
    auto val = find(e, mid, r, rc, cur);
    return mid<val.X ? val : find(e, l, mid, lc, val.Y);
}
void upd2(int p, int x, int l=0, int r=n, int id=1) {
    if(r-l == 1) {
        maxs(mx[id], x);
        return;
    }
    p<mid ? upd2(p, x, l, mid, lc) : upd2(p, x, mid, r, rc);
    mx[id] = max(mx[lc], mx[rc]);
}
int get(int s, int e, int l=0, int r=n, int id=1) {
    if(s>=r || l>=e) return 0;
    if(s<=l && r<=e) return mx[id];
    return max(get(s, e, l, mid, lc), get(s, e, mid, r, rc));
}

int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    cin >> n >> d;
    for(int i=0; i<n; i++) cin >> a[i], ord[i] = i;
    sort(ord, ord+n, [&](int i, int j) {
        return pii(a[i], -i) < pii(a[j], -j);
    });
    build();
    for(int t=0, i; t<n; t++) {
        i = ord[t];
        upd1(i);
        int pos = find(i).X;
        upd2(i, get(pos, i+1)+1);
    }
    cout << get(0, n) << '\n';
    return 0;
}
#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...