Submission #811891

# Submission time Handle Problem Language Result Execution time Memory
811891 2023-08-07T06:17:18 Z vjudge1 Financial Report (JOI21_financial) C++17
0 / 100
237 ms 145508 KB
#include<bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = (1 << 19);
const int INF = 1e9;

int n, d;
int a[N];
vector<int> mx(2 * N, -INF);

void update(int pos, int val) {
    for(mx[pos += N] = val; pos > 1; pos >>= 1) {
        mx[pos >> 1] = max(mx[pos], mx[(pos ^ 1)]);
    }
}
// last index i < qr a[i] > val
int left_bound(int qr, int val, int l = 0, int r = N - 1, int v = 1) {
    if(l >= qr || mx[v] <= val)
        return -1;
    if(l == r) 
        return l;
    int m = (l + r) / 2;
    int res = left_bound(qr, val, m + 1, r, 2 * v + 1);
    if(res == -1) res = left_bound(qr, val, l, m, 2 * v);
    return res;
}
// first index i > ql a[i] > val
int right_bound(int ql, int val, int l = 0, int r = N - 1, int v = 1) {
    if(r <= ql || mx[v] <= val)
        return -1;
    if(l == r) 
        return l;
    int m = (l + r) / 2;
    int res = right_bound(ql, val, l, m, 2 * v);
    if(res == -1) res = right_bound(ql, val, m + 1, r, 2 * v + 1);
    return res;
}

void add(int pos) {
    // cout << "add: \n";
    int lb = left_bound(pos, -INF), rb = right_bound(pos, -INF);
    // cout << pos << ' ' << lb << ' ' << rb << '\n';
    if(rb != -1) update(rb, rb - pos);
    update(pos, (lb != -1 ? pos - lb : 0));
}
int get_rb(int pos) {
    int x = right_bound(pos, d);
    if(x == -1) x = n + 1;
    return min(left_bound(x, -INF) + d, n);
}

multiset<int> st[2 * N];
int tr[2 * N];
void insert(int pos, int val) {
    for(pos += N; pos; pos >>= 1) {
        st[pos].insert(val);
    }        
}
void erase(int pos, int val) {
    for(pos += N; pos; pos >>= 1) {
        st[pos].erase(st[pos].find(val));
    }
}
int get(int ql, int qr) {
    int res = 0;
    for(ql += N, qr += N + 1; ql < qr; ql >>= 1, qr >>= 1) {
        if(ql & 1) {
            if(!st[ql].empty())
                res = max(res, *(--st[ql].end()));
            ql++;
        }
        if(qr & 1) {
            qr--;
            if(!st[qr].empty())
                res = max(res, *(--st[qr].end()));
        }
    }
    return res;
}
vector<pair<int, int>> cl[N];
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin >> n >> d;
    for(int i = 1; i <= n; i++) 
        cin >> a[i];
    vector<pair<int, int>> order;
    for(int i = 1; i <= n; i++) {
        order.push_back({a[i], i});
    }
    int rb[n + 1] = {};
    sort(order.begin(), order.end(), [](pair<int, int> x, pair<int, int> y) {
        if(x.first == y.first) return x.second > y.second;
        return x.first < y.first;
    });
    
    for(auto [a, i] : order) {
        add(i);
        rb[i] = get_rb(i);
    }
    vector<int> dp(n + 1, 1);
    for(int i = 1; i <= n; i++) {
        for(auto [x, val] : cl[i]) 
            erase(x, val);
        dp[i] = max(dp[i], get(1, a[i] - 1) + 1);
        insert(a[i], dp[i]);
        cl[rb[i] + 1].push_back({a[i], dp[i]});
    }
    cout << *max_element(dp.begin(), dp.end());
}
# Verdict Execution time Memory Grader output
1 Runtime error 84 ms 133548 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 84 ms 133548 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 84 ms 133548 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 237 ms 145508 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 201 ms 145496 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 84 ms 133548 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -