Submission #1262053

#TimeUsernameProblemLanguageResultExecution timeMemory
1262053dhuyyyyGlobal Warming (CEOI18_glo)C++20
58 / 100
2095 ms15620 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long
using namespace std;

using ll = long long;
using ii = pair<int,int>;
using pii = pair<int,ii>;
using aa = array<int,4>;

const int N = 2e5+5;
const int INF = 1e9;
const int MOD = 998244353;

int n,m,x,ans = 0;
int a[N],b[N],A[N],dp[N],t[N * 8],pre[N],LIS[N];
vector <int> v;
void update(int id,int l,int r,int pos,int val){
    if (r < pos || l > pos) return;
    if (l == r){
        t[id] = max(t[id],val);
        return;
    }
    int mid = (l + r) >> 1;
    update(id*2,l,mid,pos,val);
    update(id*2+1,mid+1,r,pos,val);
    t[id] = max(t[id*2],t[id*2+1]);
}
int get(int id,int l,int r,int u,int v){
    if (r < u || l > v) return 0;
    if (u <= l && r <= v) return t[id];
    int mid = (l + r) >> 1;
    return max(get(id*2,l,mid,u,v),get(id*2+1,mid+1,r,u,v));
}
int calc(int val){
    return lower_bound(v.begin(),v.end(),val) - v.begin();
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    cin >> n >> x;
    for (int i = 1; i <= n; i++){
        cin >> a[i];
        A[i] = a[i] + x;
        v.push_back(a[i]);
        v.push_back(A[i]);
    }
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    m = (int)v.size();
    for (int i = 1; i <= n; i++) a[i] = calc(a[i]) + 1;
    for (int i = 1; i <= n; i++) A[i] = calc(A[i]) + 1;
    for (int i = 1; i <= n; i++){
        int j = lower_bound(b+1,b+1+ans,a[i]) - b;
        dp[i] = j;
        b[j] = a[i];
        ans = max(ans,j);
    }
    LIS[n] = 1;
    for (int i = 1; i <= n; i++) b[i] = 0;
    b[1] = a[n];
    int tmp = 1;
    for (int i = n - 1; i >= 1; i--){
        int j = tmp;
        while (j >= 1 && a[i] >= b[j]) j--;
        if (j == tmp) b[++tmp] = a[i];
        b[j + 1] = max(b[j + 1],a[i]);
        LIS[i] = j + 1;
    }
//    for (int i = 1; i <= n; i++) cout << a[i] << ' ';
//    cout << '\n';
//    for (int i = 1; i <= n; i++) cout << dp[i] << ' ';
//    cout << '\n';
//    for (int i = 1; i <= n; i++) cout << A[i] << ' ';
//    cout << '\n';
    ans = 0;
    for (int i = 0; i < n; i++){
        update(1,1,m,a[i],dp[i]);
        int tmp = get(1,1,m,1,A[i+1]-1);
        ans = max(ans,tmp + LIS[i+1]);
//        cout << tmp << ' ' << LIS[i+1] << '\n';
    }
    cout << ans;
    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...