제출 #1325406

#제출 시각아이디문제언어결과실행 시간메모리
1325406husseinjuandaFinancial Report (JOI21_financial)C++20
0 / 100
409 ms66180 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

vector<int> t;
vector<pair<int, int>> t1;
vector<int> d;

int get(int idx){
    auto it = lower_bound(d.begin(), d.end(), idx) - d.begin();
    return it;
}

void update(int i, int l, int r, int l1, int r1, int v){
    if(l1 > r || l > r1) return;
    if(t1[i].first == -1){
        t[i] = 0;
        t1[i*2].first = -1;
        t1[i*2].second = 0;
        t1[i*2+1].first = -1;
        t1[i*2+1].second = 0;
        t1[i].first = 0;
        t[i*2] = 0;
        t[i*2+1] = 0;
    }
    if(t1[i].second > 0){
        t[i] = max(t[i], t1[i].second);
        t1[i*2].second = max(t1[i*2].second, t1[i].second);
        t1[i*2+1].second = max(t1[i*2+1].second, t1[i].second);
        t1[i].second = 0;
    }
    if(l1 <= l && r1 >= r){
        if(v == -1){
            t[i] = 0;
            t1[i*2].first = -1;
            t1[i*2+1].first = -1;
            t1[i*2].second = 0;
            t1[i*2+1].second = 0;
            t[i*2] = 0;
            t[i*2+1] = 0;
            return;
        }
        t[i] = max(t[i], v);
        t1[i*2].second = max(t1[i*2].second, v);
        t1[i*2+1].second = max(t1[i*2+1].second, v);
        return;
    }
    int mid = (l+r)/2;
    update(i*2, l, mid, l1, r1, v);
    update(i*2+1, mid+1, r, l1, r1, v);
    t[i] = max(t[i*2], t[i*2+1]);
}

int query(int i, int l, int r, int l1, int r1){
    if(l > r1 || l1 > r) return 0;
    if(t1[i].first == -1){
        t[i] = 0;
        t1[i*2].first = -1;
        t1[i*2].second = 0;
        t1[i*2+1].first = -1;
        t1[i*2+1].second = 0;
        t1[i].first = 0;
    }
    if(t1[i].second > 0){
        t[i] = max(t[i], t1[i].second);
        t1[i*2].second = max(t1[i*2].second, t1[i].second);
        t1[i*2+1].second = max(t1[i*2+1].second, t1[i].second);
        t1[i].second = 0;
    }
    if(l1 <= l && r1 >= r){
        return t[i];
    }
    int mid = (l+r)/2;
    return max(query(i*2, l, mid, l1, r1), query(i*2+1, mid+1, r, l1, r1));
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, dis; cin >> n >> dis;
    vector<int> a(n);
    for(int i = 0; i < n; i++){
        cin >> a[i];
    } 
    d = a;
    sort(d.begin(), d.end());
    d.erase(unique(d.begin(), d.end()), d.end());
    t.resize(4*d.size());
    t1.resize(8*d.size());
    multiset<int> s;
    for(int i = 0; i < n; i++){
        // cout << i << endl;
        int j = 0;
        if(a[i] == d[0]){
            j = 1;
        }else{
            j = query(1, 0, d.size()-1, 0, get(a[i])-1)+1;
        }
        // cout << j << " ";
        update(1, 0, d.size()-1, get(a[i]), get(a[i]), j);
        s.insert(a[i]);
        if(i-dis >= 0){
            s.erase(s.find(a[i-dis]));
        }
        int mn = *s.begin();
        // cout << mn << " ";
        if(mn != d[0]){
            update(1, 0, d.size()-1, 0, get(mn)-1, -1);
        }
    }
    // cout << "\n";
    cout << query(1, 0, d.size()-1, 0, d.size()-1) << "\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...