Submission #435333

#TimeUsernameProblemLanguageResultExecution timeMemory
435333jangwonyoungDistributing Candies (IOI21_candies)C++17
100 / 100
608 ms31500 KiB
////////////////////////////////////////
#include "candies.h"

#include <vector>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
const int N=2e5+5;
#define fi first
#define se second
int n,q;
vector<pair<int,int> >qr[N];
const int ts=1<<19;
ll mx[ts];
ll mn[ts];
ll sum[ts];
void pull(int id){
    sum[id]=sum[id*2]+sum[id*2+1];
    mx[id]=max(mx[id*2],mx[id*2+1]+sum[id*2]);
    mn[id]=min(mn[id*2],mn[id*2+1]+sum[id*2]);
}
void upd(int id,int l,int r,int p,ll v){
    if(l==r){
        mx[id]=0;
        mn[id]=0;
        sum[id]=v;
        if(v>0) mx[id]=v;
        else mn[id]=v;
        return;
    }
    int mid=(l+r)/2;
    if(p<=mid) upd(id*2,l,mid,p,v);
    else upd(id*2+1,mid+1,r,p,v);
    pull(id);
}
ll qry(int id,int l,int r,ll v,ll c){
    if(l==r){
        ll res=v+sum[id];
        res=min(res,c);
        res=max(res,0LL);
        return res;
    }
    int mid=(l+r)/2;
    if(mx[id*2+1]-mn[id*2+1]>=c){
        ll res=qry(id*2+1,mid+1,r,v,c);
        return res;
    }
    v=qry(id*2,l,mid,v,c);
    if(v+mx[id*2+1]>c){
        return c+sum[id*2+1]-mx[id*2+1];
    }
    if(v+mn[id*2+1]<0){
        return sum[id*2+1]-mn[id*2+1];
    }
    return v+sum[id*2+1];
}
vector<int>distribute_candies(vi c,vi l,vi r,vi v){
    n=c.size();q=l.size();
    vi ans(n);
    for(int i=0; i<q ;i++){
        qr[l[i]+1].push_back({i+1,v[i]});
        qr[r[i]+2].push_back({i+1,0});
    }
    for(int i=1; i<=n ;i++){
        for(auto c:qr[i]){
            upd(1,1,q,c.fi,c.se);
        }
        ans[i-1]=qry(1,1,q,0,c[i-1]);
    }
    return ans;
}

//////////////////////////////////////////
#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...