Submission #953436

#TimeUsernameProblemLanguageResultExecution timeMemory
953436RifalGlobal Warming (CEOI18_glo)C++14
100 / 100
1809 ms89684 KiB
#include <bits/stdc++.h>
#include <fstream>
#define endl '\n'
#define mod 1000000007
#define INF 1000000000
#define INF2 2000000000
///#define cin fin
///#define cout fout
using namespace std;
double const EPS = 1e-14;
typedef long long ll;
///ofstream fout("herding.out");
///ifstream fin("herding.in");
const int M = 6e5 + 3;
const int N = 6e5 + 5;
ll seg[N*4];
map<ll,int> mp;
void Build(int x, int l, int r) {
    if(l == r) {
        seg[x] = 0;
    }
    else {
        int mid = (l+r)/2;
        Build(x*2,l,mid); Build(x*2+1,mid+1,r);
        seg[x] = 0;
    }
}
void Update(int x, int l, int r, int pos, ll val) {
    if(l == r) {
        seg[x] = max(seg[x],val);
    }
    else {
        int mid = (l+r)/2;
        if(pos <= mid) Update(x*2,l,mid,pos,val);
        else Update(x*2+1,mid+1,r,pos,val);
        seg[x] = max(seg[x*2],seg[x*2+1]);
    }
}
ll sol(int x, int l, int r, int L, int R) {
    if(l > R || r < L) {
        return 0;
    }
    else if(l >= L && r <= R) {
        return seg[x];
    }
    else {
        int mid = (l+r)/2;
        return max(sol(x*2,l,mid,L,R),sol(x*2+1,mid+1,r,L,R));
    }
}
int main()
{
    ios_base::sync_with_stdio(0);cout.tie(0);cin.tie(0);
    int n; ll x; cin >> n >> x; ll arr[n+1] = {};
    set<ll> st;
    for(int i = 1; i <= n; i++){
        cin >> arr[i];
        st.insert(arr[i]);
        st.insert(arr[i]-x);
        st.insert(arr[i]+x);
    }
    ll dp1[n+1] = {}, dp2[n+1] = {};
    int cnt = 1;
    for(auto i : st) {
        mp[i] = cnt; cnt++; }
    for(int i = 1; i <= n; i++) {
        int cur = mp[arr[i]];
        ll mx = sol(1,1,M,1,cur-1);
        dp1[i] = max(dp1[i],mx+1);
        Update(1,1,M,cur,dp1[i]);
    }
    Build(1,1,M);
    for(int i = n; i >= 1; i--) {
        int cur = mp[arr[i]];
        ll mx = sol(1,1,M,cur+1,M);
        dp2[i] = max(dp2[i],mx+1);
        Update(1,1,M,cur,dp2[i]);
    }
    Build(1,1,M);
    ll ans = 0;
    for(int i = 1; i <= n; i++) {
        int cur = mp[arr[i]+x];
        int cur2 = mp[arr[i]];
        ll mx = sol(1,1,M,1,cur-1);
        ans = max(ans,dp2[i]+mx);
        Update(1,1,M,cur2,dp1[i]);
    }
    Build(1,1,M);
    for(int i = n; i >= 1; i--) {
        int cur = mp[arr[i]-x];
        int cur2 = mp[arr[i]];
        ll mx = sol(1,1,M,cur+1,M);
        ans = max(ans,mx+dp1[i]);
        Update(1,1,M,cur2,dp2[i]);
    }
    cout << ans << endl;
    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...