Submission #1326712

#TimeUsernameProblemLanguageResultExecution timeMemory
1326712BigBadBullyDistributing Candies (IOI21_candies)C++20
8 / 100
422 ms43000 KiB
#include "candies.h"

#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define ff first
#define ss second
const int inf = 1e18;
using namespace std;
struct node{
    int pref = 0,sub= 0,sum= 0,suf=0,mxp =0;
    node operator+(node b)
    {
        node res;
        res.sum = sum+b.sum;
        res.pref = min(pref,b.pref+sum);
        res.suf = min(b.suf,suf+b.sum);
        res.mxp=max(mxp,b.mxp+sum);
        res.sub = min({sub,b.sub,suf+b.pref});
        return res;
    }
};

struct seggy{
    int n;
    vector<node> t;
    seggy(int sz){
        n = sz;
        t.resize(2*n,node());
    }
    void update(int i,int x)
    {
        node&a = t[i+=n];
        a.sum = x;
        a.pref=min(x,0ll);
        a.suf = a.pref;
        a.sub = min(0ll,x);
        a.mxp = max(0ll,x);
        for(;i>1;i/=2)
        {
            if(i < (i^1))
            t[i/2]=t[i]+t[i^1]; 
            else
            t[i/2]=t[i^1]+t[i];
        }
            
    }
    node query(int l,int r)
    {
        r++;
        if(l>r)
            return node();
        node res;
        for(l+=n,r+=n;l<r;l/=2,r/=2)
        {
            if(l&1)
                res = res+t[l++];
            if(r&1)
                res = res+t[--r];
        }
        return res;
    }
};

vector<signed> distribute_candies(vector<signed> c, vector<signed> l,
vector<signed> r, vector<signed> v) {
    int n = c.size();
    int q= l.size();
    vector<vector<pii>> add(n),rem(n);                     
    for(int i = 0;i  <q;i++)
    {
        add[l[i]].push_back({i,v[i]});
        rem[r[i]].push_back({i,v[i]});
    }
    seggy mile(q);
    vector<signed> ans(n);
    for(int i = 0; i < n; i++)
    {
        for(pii x:add[i])
            mile.update(x.ff,x.ss);
            int idx = -1;
        {
            int l = -1,r = q-1;
            while(r-l)
            {
                int mid = (l+r+1)>>1;
                if(-mile.query(mid,q-1).sub >= c[i])
                    l = mid;
                else
                    r = mid-1;
            }
            idx = l;
        }
        node g = mile.query(idx+1,q-1);
        int lit = -min(0ll,g.pref);
        int big = max(0ll,g.mxp+lit-c[i]);
        ans[i] = g.sum-big+lit;
        for(pii x:rem[i])
            mile.update(x.ff,0);
    }

    
    return ans;
}
#undef int 
#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...