제출 #1186940

#제출 시각아이디문제언어결과실행 시간메모리
1186940DangKhoizzzzGlobal Warming (CEOI18_glo)C++17
100 / 100
214 ms9388 KiB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e6;

struct Segment_Tree
{
    int st[(maxn + 7)*4];

    void update(int id , int l , int r , int pos , int val)
    {
        if(r < pos || l > pos) return;
        if(l == r)
        {
            st[id] = max(st[id] , val);
            return;
        }
        int mid = (l+r) >> 1;
        update(id*2 , l , mid , pos , val);
        update(id*2+1, mid+1 , r , pos , val);
        st[id] = max(st[id*2] , st[id*2+1]);
    }

    int get(int id , int l , int r, int u , int v)
    {
        if(r < u || l > v) return -1;
        if(u <= l && r <= v) return st[id];
        int mid = (l+r) >> 1;
        return max(get(id*2 , l , mid , u , v) , get(id*2+1 , mid+1 , r , u , v));
    }
} ST;

int n , x , a[maxn] , lis[maxn];

vector <int> val;

void compress()
{
    for(int i = 1; i <= n; i++)
    {
        val.push_back(a[i] + 1);
        val.push_back(a[i] + 1 - x);
        val.push_back(a[i]);
    }
    sort(val.begin() , val.end());
    val.erase(unique(val.begin() , val.end()) , val.end());
}

int encode(int x)
{
    return (int)(upper_bound(val.begin() , val.end() , x) - val.begin());
}

void build()
{
    vector <int> LIS;
    for(int i = 1; i <= n; i++)
    {
        int pos = lower_bound(LIS.begin() , LIS.end() , a[i]) - LIS.begin();

        if(pos == LIS.size())
        {
            LIS.push_back(a[i]);
            lis[i] = LIS.size();
        }
        else
        {
            LIS[pos] = a[i];
            lis[i] = pos + 1;
        }
    }
}

void solve()
{
    cin >> n >> x;
    for(int i = 1; i <= n; i++) cin >> a[i];
    compress();
    build();

    int ans = 1;

    for(int i = n; i >= 1; i--)
    {
        int res = lis[i] + ST.get(1 , 1 , maxn , encode(a[i]+1-x) , maxn);
        ans = max(ans , res);
        int upd = ST.get(1 , 1 , maxn , encode(a[i] + 1) , maxn);
        ST.update(1, 1 , maxn , encode(a[i]) , upd + 1);
    }

    cout << ans << '\n';
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    solve();
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...