Submission #1277908

#TimeUsernameProblemLanguageResultExecution timeMemory
1277908zagaroGlobal Warming (CEOI18_glo)C++20
27 / 100
31 ms3220 KiB
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
/**zagaro & lauren <3**/
#define mod 1000000007 //1e9 + 7
#define pi acos(-1)
#define wl while
#define str string
#define ENDL "\n"
#define sal ' '
#define tp_set ll
#define prc(n) cout.precision(n);cout<<fixed;
#define ord_set tree<tp_set, null_type, less<tp_set>, rb_tree_tag, tree_order_statistics_node_update>
typedef long long ll;
typedef bool bl;
typedef char car;
using namespace std;
using namespace __gnu_pbds;
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    ll n, d, x, l, r, m, X;
    cin>>n>>d;
    vector<ll> dp(1, 0);
    vector<pair<ll,ll> > sm(1,{0, d});
    for(int i=1;i<=n;i++){
        cin>>x;
        X = x+d;
        do{
            l=0;r=dp.size();
            wl(l<r-1){
                 m = (l+r)/2;
                if(dp[m] >= X)r=m;
                else l=m;
            }
            if(sm[r-1].first == 0)break;
            X = x+sm[r-1].first;
        }while(X < dp[r-1]);
        if(r == dp.size()){
            if(sm[r-1].first == 0){
                dp.push_back(dp[r-1]+1);
                sm.push_back({dp[r-1]+1-x, d});
            }
            else {
                dp.push_back(X);
                sm.push_back(sm[r-1]);
            }
        }
        else {
            if(X == dp[r-1]){
                if(sm[r-1].second > sm[r-1].first){
                    if(r == dp.size()){
                        dp.push_back(X+1);
                        sm.push_back({sm[r-1].first+1, sm[r-1].second});
                    }
                    else {
                        dp[r] = X+1;
                        sm[r] = {sm[r-1].first+1, sm[r-1].second};
                    }
                }
            }
            else {
                if(r == dp.size()){
                    dp.push_back(X);
                    sm.push_back(sm[r-1]);
                }
                else {
                    dp[r] = X;
                    sm[r] = sm[r-1];
                }
            }
        }
        dp[r] = X;sm[r] = sm[r-1];
        l=0;r=dp.size();
        wl(l<r-1){
            m = (l+r)/2;
            if(dp[m] >= x)r=m;
            else l=m;
        }
        if(sm[r-1].first == 0){
            dp[r] = x;
            sm[r] = {0, d};
        }
        else {
            dp[r] = x;
            sm[r] = {sm[r-1].first, min(x-1-dp[r-1]+sm[r-1].first, min(d, sm[r-1].second))};
        }
    }
    cout<<dp.size()-1<<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...