Submission #1239701

#TimeUsernameProblemLanguageResultExecution timeMemory
1239701nasjesSnowball (JOI21_ho_t2)C++20
100 / 100
156 ms11424 KiB
#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <bitset>
#include <string>
#include <cstring>
#include <iterator>
#include <random>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef long double ld;
const ll dim = 1e6+7;
//const ll mod = 1e9 + 7;
const ll inf = 1e18 + 77;
#define endl "\n"
#define fi first
#define pb push_back
#define se second
#define vll vector<ll>
ll n, a[dim], sz[dim], q;
ll pr[dim], dx[dim], lft[dim], rt[dim];
int main(){

    cin>>n>>q;
    for(int i=1; i<=n; i++){
        cin>>a[i];
    }
    for(int i=1; i<=q; i++){
        cin>>dx[i];
        pr[i]=pr[i-1]+dx[i];
        lft[i]=min(pr[i], lft[i-1]);
        rt[i]=max(pr[i], rt[i-1]);
    }
    for(int i=1; i<=q; i++){
        lft[i]=abs(lft[i]);
    }
    a[n+1]=inf;
    a[0]=-inf;
    sz[1]+=lft[q];
    for(int i=1; i<=n; i++){
       if(rt[q]+a[i]<=a[i+1]-lft[q]){
           sz[i]+=rt[q];
           sz[i+1]+=lft[q];
       }
       else{
           ll l=0;
           ll r=q;
           while(r-l>=1){
               ll mid=(l+r+1)/2;
               if(rt[mid]+a[i]>a[i+1]-lft[mid]){
                   r=mid-1;
               }
               else{
                   l=mid;
               }
           }
           if(pr[l+1]>0){
               sz[i+1]+=lft[l];
               sz[i]+=min(a[i+1]-a[i]-lft[l],rt[l+1]);
           }
           else{
               sz[i]+=rt[l];
               sz[i+1]+=min(a[i+1]-a[i]-rt[l],lft[l+1]);
           }
       }
    }
    for(int i=1; i<=n; i++){
        cout<<sz[i]<<endl;
    }
    cout<<endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...