Submission #1184441

#TimeUsernameProblemLanguageResultExecution timeMemory
1184441inesfiGlobal Warming (CEOI18_glo)C++20
0 / 100
82 ms14508 KiB
#include<bits/stdc++.h>
using namespace std;

#define endl "\n"
#define int long long

const int TAILLEMAXI=(1<<19),DECA=(1<<18);
vector<pair<int,int>> tries;
int prefixe[DECA],suffixe[DECA];
int arbre[TAILLEMAXI][3];
int nbval,decamax,rep;
int place[DECA],apres[DECA];
int r;

int maxi(int a,int b,int tab){
    if (a==b){
        return arbre[a][tab];
    }
    if (a%2==1){
        return max(arbre[a][tab],maxi(a+1,b,tab));
    }
    if (b%2==0){
        return max(arbre[b][tab],maxi(a,b-1,tab));
    }
    return maxi(a/2,b/2,tab);
}

void change(int a,int tab){
    while (a>1){
        a/=2;
        arbre[a][tab]=max(arbre[a*2][tab],arbre[a*2+1][tab]);
    }
}

void lecture(){
    cin>>nbval>>decamax;
    for (int i=0;i<nbval;i++){
        int val;
        cin>>val;
        tries.push_back({val,-i});
    }
    sort(tries.begin(),tries.end());
}

void pref(){
    for (auto i:tries){
        int pos=-i.second;
        prefixe[pos]=maxi(DECA,DECA+pos,0)+1;
        arbre[DECA+pos][0]=prefixe[pos];
        r=max(rep,prefixe[pos]);
        change(DECA+pos,0);
    }
}

void suff(){
    for (int j=nbval-1;j>=0;j--){
        int i=-tries[j].second;
        suffixe[i]=maxi(DECA+i,DECA+nbval,1)+1;
        arbre[DECA+i][1]=suffixe[i];
        //rep=max(rep,suffixe[i]);
        change(DECA+i,1);
    }
}

void construire(){
    for (int i=0;i<nbval;i++){
        place[tries[i].second]=i;
    }
    int a=0,b=0;
    /*for (int i=0;i<nbval;i++){
        cout<<tries[i].first-decamax<<" ";
    }
    cout<<endl;
    for (int i=0;i<nbval;i++){
        cout<<tries[i].first<<" ";
    }
    cout<<endl;
    return ;*/
    while (a<nbval and b<nbval){
        if (tries[a].first-decamax<tries[b].first){
            apres[-tries[a].second]=b;
            //cout<<a<<endl;
            a++;
        }
        else {
            b++;
        }
    }
    if (b==nbval){
        for (int i=a;i<nbval;i++){
            apres[-tries[a].second]=nbval;
        }
    }
}

int trouver(){
    int rep=0;
    for (int i=nbval-1;i>=0;i--){
        rep=max(rep,prefixe[i]+maxi(apres[i]+DECA,nbval+DECA,2));
        arbre[place[i]+DECA][2]=suffixe[i];
        change(place[i]+DECA,2);
    }
    return rep;
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    lecture();
    pref();
    cout<<r<<endl;
    return 0;
    suff();
    construire();
    cout<<trouver()<<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...