Submission #799547

#TimeUsernameProblemLanguageResultExecution timeMemory
799547antonSafety (NOI18_safety)C++17
66 / 100
2074 ms2364 KiB
#include<bits/stdc++.h>

using namespace std;
#define int long long
#define pii pair<int, int>


const int MAX_N = 2*1e5;
const int INF = 1e18;
int n, h, A[MAX_N], B[MAX_N], C[MAX_N];
int up_cost[MAX_N], down_cost[MAX_N];
int up_limit[MAX_N], down_limit[MAX_N];

void find_costs(int l, int r){
    for(int i = l; i<r; i++){
        C[i] = B[i]-A[i];
        if(C[i] == 0){
            up_cost[i] = 1;
            down_cost[i] = 1;
            up_limit[i]= INF;
            down_limit[i] = INF;
        }
        else if(C[i]<0){
            up_limit[i] = abs(C[i]);
            down_limit[i] =INF;
            up_cost[i] =-1;
            down_cost[i] =1;
        }
        else if(C[i]>0){
            up_limit[i] = INF;
            down_limit[i] = abs(C[i]);
            up_cost[i] =1;
            down_cost[i] =-1;
        }
    }
}
signed main(){
    cin>>n>>h;

    for(int i = 0; i<n; i++){
        cin>>A[i];
    }
    int res= 0;
    B[0] = A[0];
    C[0] =0;
    up_cost[0] = down_cost[0] = 1;
    vector<pii> oc;
    for(int i = 1; i<n; i++){
        if(abs(A[i]-B[i-1])<=h){
            B[i] = A[i];
            C[i] = 0;
            up_cost[0] = down_cost[0] = 1;
        }
        else{
            int pos = -1;
            int s= 0;
            if(A[i]>B[i-1]){
                ////cout<<"up"<<endl;
                
                int lim = abs(B[i-1] -A[i]);
                oc.clear();
                oc.push_back(pii(i, 0));
                for(int j = i-1; j>=0; j--){
                    s+=up_cost[j];
                    lim = min(lim, up_limit[j]);
                    
                    //cout<<"lim "<<lim<<endl;
                    if(s==0){
                        
                        oc.push_back(pii(j, lim));
                    }
                }
                reverse(oc.begin(), oc.end());
                int move =0;
                for(int inter= 0; inter<oc.size()-1; inter++){
                    int j = oc[inter].first;
                    if(oc[inter].first>0){
                        //cout<<"diff "<<abs(B[j-1]+h-B[j]-move)<<endl;
                        move = min(oc[inter].second, move +abs(B[j-1]+h-B[j]-move));
                    }
                    else{
                        move = oc[inter].second;
                    }
                    
                    //cout<<oc[inter].first<<" "<<move<<endl;
                    for(int j = oc[inter].first; j<oc[inter+1].first; j++){
                        B[j] += move;
                    }
                }
                find_costs(0, i+1);
            }
            else{
                ////cout<<"down"<<endl;
                int lim = abs(B[i-1] -A[i]);
                oc.clear();
                oc.push_back(pii(i, 0));
                for(int j = i-1; j>=0; j--){
                    s+=down_cost[j];
                    lim = min(lim, down_limit[j]);
                    ////cout<<"cost "<<up_cost[j]<<endl;
                    //cout<<"lim "<<lim<<endl;
                    if(s==0){
                        oc.push_back(pii(j,lim));
                    }
                }
                reverse(oc.begin(), oc.end());
                int move =0;
                for(int inter= 0; inter<oc.size()-1; inter++){
                    
                    int j = oc[inter].first;
                    if(oc[inter].first>0){
                        move = min(oc[inter].second, move +abs(B[j-1]-h-B[j]+move));
                    }
                    else{
                        move = oc[inter].second;
                    }
                    //cout<<oc[inter].first<<" "<<move<<endl;
                    for(int j = oc[inter].first; j<oc[inter+1].first; j++){
                        B[j] -= move;
                    }
                }
                find_costs(0, i+1);
                
            }

            if(abs(A[i]-B[i-1])<=h){
                B[i] = A[i];
                C[i] = 0;
                up_cost[0] = down_cost[0] = 1;
            }
            else{
                if(A[i]>B[i-1]){
                    B[i] = B[i-1] +h;
                }
                else{
                    B[i] = B[i-1] -h;
                }
            } 
        }
        find_costs(0, i+1);

        for(int i = 0; i<n; i++){
            //cout<<B[i]<<" ";
        }
        //cout<<endl;
        ////cout<<endl;
    }

    find_costs(0, n);

    for(int i = 0; i<n; i++){
        res+=abs(C[i]);
    }

    for(int i = 0; i<n; i++){
        //cout<<B[i]<<" ";
    }
    //cout<<endl;

    cout<<res<<endl;


}

Compilation message (stderr)

safety.cpp: In function 'int main()':
safety.cpp:75:40: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |                 for(int inter= 0; inter<oc.size()-1; inter++){
      |                                   ~~~~~^~~~~~~~~~~~
safety.cpp:108:40: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  108 |                 for(int inter= 0; inter<oc.size()-1; inter++){
      |                                   ~~~~~^~~~~~~~~~~~
safety.cpp:55:17: warning: unused variable 'pos' [-Wunused-variable]
   55 |             int pos = -1;
      |                 ^~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...