제출 #1165457

#제출 시각아이디문제언어결과실행 시간메모리
1165457enzyGlobal Warming (CEOI18_glo)C++20
100 / 100
426 ms38592 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+10;
int dp[maxn][2], seg[4*maxn][2], v[maxn], add[maxn];
map<int,int>relaciona;
void update(int t, int id, int ini, int fim, int cara, int val){
    if(ini==fim){
        seg[id][t]=max(seg[id][t],val);
        return;
    }
    int mid=(ini+fim)/2, e=2*id, d=2*id+1;
    if(cara<=mid) update(t,e,ini,mid,cara,val);
    else update(t,d,mid+1,fim,cara,val);
    seg[id][t]=max(seg[e][t],seg[d][t]);
}
int query(int t, int id, int ini, int fim, int l, int r){
    if(r<l) return 0;
    if(ini>r||fim<l) return 0;
    if(ini>=l&&fim<=r) return seg[id][t];
    int mid=(ini+fim)/2, e=2*id, d=2*id+1;
    return max(query(t,e,ini,mid,l,r),query(t,d,mid+1,fim,l,r));
}
signed main()
{
    ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    int n, x; cin >> n >> x;
    set<int>comp;
    queue<int>q;
    for(int i=1;i<=n;i++){
        cin >> v[i];
        comp.insert(v[i]);
    }
    int cnt=1;
    for(int a : comp){
        relaciona[a]=cnt;
        q.push(a);
        while(!q.empty()){
            int u=q.front();
            if(u+x>a) break;
            q.pop();
            add[relaciona[u]]=relaciona[a]-relaciona[u];
        }
        cnt++;
    }
    while(!q.empty()){
        int u=q.front(); q.pop();
        add[relaciona[u]]=cnt-relaciona[u];
    }
    if(x==0) for(int i=1;i<=n;i++) add[i]=0;
    for(int i=1;i<=n;i++) v[i]=relaciona[v[i]];
    for(int i=1;i<=n;i++){ // vendo se o cara i for o ultimo cara da minha LIS
        dp[i][0]=query(0,1,1,n,1,v[i]-1)+1; // no estado zero eu ainda n usei o intervalo pra diminuir
        dp[i][1]=max(query(0,1,1,n,1,v[i]-1+add[v[i]]),query(1,1,1,n,1,v[i]-1))+1;
        update(0,1,1,n,v[i],dp[i][0]);
        update(1,1,1,n,v[i],dp[i][1]);
    }
    int resp=0;
    /*for(int i=1;i<=6;i++) cout << add[i] << " ";
    cout << endl;
    for(int i=1;i<=n;i++) cout << dp[i][0] << " ";
    cout << endl;
    for(int i=1;i<=n;i++) cout << dp[i][1] << " ";
    cout << endl;*/
    for(int i=1;i<=n;i++) resp=max({resp,dp[i][0],dp[i][1]});
    cout << resp << 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...