제출 #70964

#제출 시각아이디문제언어결과실행 시간메모리
70964MatheusLealVGlobal Warming (CEOI18_glo)C++17
100 / 100
1000 ms171020 KiB
#include <bits/stdc++.h>
#define N 200050
#define limite (1000000005)
#define mid ((a + b)/2)
using namespace std;

int n, v[N], dp[N][2], x, resp;

struct node
{
    int val;

    node *l, *r;

    node()
    {
        val = 0;

        l = r = NULL;
    }
};

node *root = new node(), *root1 = new node();

void upd(node *root, int a, int b, int i, int x)
{
    if(a == b)
    {
        root->val = max(root->val, x);

        return;
    }

    if(i <= mid)
    {
        if(!root->l) root->l = new node();

        upd(root->l, a, mid, i, x);
    }

    else
    {
        if(!root->r) root->r = new node();

        upd(root->r, mid + 1, b, i, x);
    }

    root->val = max( (root->l ? root->l->val : 0), (root->r ? root->r->val : 0) );
}

int query(node *root, int a, int b, int i, int j)
{
    if(!root or (j < a or i > b)) return 0;

    if(i <= a and j >= b) return root->val;

    return max(query(root->l, a, mid, i, j), query(root->r, mid + 1, b, i, j));
}

int main()
{
    ios::sync_with_stdio(false); cin.tie(0);

    cin>>n>>x;

    for(int i = 1; i <= n; i++) cin>>v[i];

    for(int i = 1; i <= n; i++)
    {
        int A = query(root1, 0, limite, 0, v[i] - 1), B = query(root, 0, limite, 0, v[i] - 1);

        int C = query(root1, 0, limite, v[i], v[i] + x - 1);

        dp[i][1] = A + 1;

        dp[i][0] = max({A, B, C}) + 1;

        resp = max({resp, dp[i][0], dp[i][1]});

        upd(root, 0, limite, v[i], dp[i][0]);

        upd(root1, 0, limite, v[i], dp[i][1]);
    }

    cout<<resp<<"\n";
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...