Submission #1282283

#TimeUsernameProblemLanguageResultExecution timeMemory
1282283FaggiDistributing Candies (IOI21_candies)C++20
0 / 100
3605 ms2162688 KiB
#include <bits/stdc++.h>
#define ll long long
#define sz(x) int(x.size())
#define forn(i, n) for (i = 0; i < n; i++)
#define all(x) x.begin(), x.end()
#define pb push_back
#define mp make_pair
#define fr first
#define se second
using namespace std;

ll INF = 1e15, MIN=-1e15;
const int MAXQ = 2e5 + 1;
struct nodo
{
    ll mi = INF, ma = MIN, lazy = 0, tim;

    bool L = 0, R = 0;
    nodo *l = nullptr, *r = nullptr;
};

nodo *seg = new nodo();
nodo *roots[MAXQ];
vector<ll> I, D;
ll n, act = 1, pot=1;

void create(nodo *&a, nodo *b)
{
    if(b==nullptr)
        b=new nodo();
    a = new nodo(*b);
    a->R=a->L=0;
    a->tim=act++;
}

void upd(nodo *a, nodo *nod)
{
    a->ma=max(a->ma,a->lazy+nod->ma);
    a->mi=min(a->mi,a->lazy+nod->mi);
    a->lazy+=nod->lazy;
}

void prop(nodo *nod)
{
    nodo *l, *r;
    if(!(nod->L)||nod->l==nullptr)
    {
        create(l,nod->l);
        nod->l=l;
        nod->L=1;
    }
    if(!(nod->R)||nod->r==nullptr)
    {
        create(r,nod->r);
        nod->r=r;
        nod->R=1;
    }
    
    upd(nod->l, nod);
    upd(nod->r, nod);
    nod->ma=MIN;
    nod->mi=INF;
    nod->lazy=0;
}

void update(nodo *nod, ll l, ll r, ll a, ll b, ll x)
{
    if(l>b||r<a)
        return;
    if(a<=l&&r<=b)
    {
        nod->lazy+=x;
        nod->ma=max(nod->ma,nod->lazy);
        nod->mi=min(nod->mi,nod->lazy);
        return;
    }
    prop(nod);
    ll mid=(l+r)/2;
    update(nod->l,l,mid,a,b,x);
    update(nod->r,mid+1,r,a,b,x);
}

ll calc(nodo *nod, ll l, ll r, ll a, ll b)
{
    if(l>b||r<a)
        return 0;
    if(a<=l&&r<=b)
        return nod->lazy;
    prop(nod);
    ll mid=(l+r)/2;
    return calc(nod->l,l,mid,a,b)+calc(nod->r,mid+1,r,a,b);
}
ll calcMi(nodo *nod, ll l, ll r, ll a, ll b)
{
    if(l>b||r<a)
        return INF;
    if(a<=l&&r<=b)
        return nod->mi;
    prop(nod);
    ll mid=(l+r)/2;
    return min(calcMi(nod->l,l,mid,a,b),calcMi(nod->r,mid+1,r,a,b));
}
ll calcMa(nodo *nod, ll l, ll r, ll a, ll b)
{
    if(l>b||r<a)
        return MIN;
    if(a<=l&&r<=b)
        return nod->ma;
    prop(nod);
    ll mid=(l+r)/2;
    return max(calcMa(nod->l,l,mid,a,b),calcMa(nod->r,mid+1,r,a,b));
}


std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l, std::vector<int> r, std::vector<int> v)
{
    n = sz(c);
    while(pot<n)
        pot*=2;
    seg->tim = act++;

    ll i;
    vector<ll>fin(sz(c)+1,0);
    for(i=0; i<sz(l); i++)
    {
        fin[l[i]]+=v[i];
        fin[r[i]+1]-=v[i];
    }
    for(i=1; i<sz(c); i++)
        fin[i]+=fin[i-1];
    
    for(i=0; i<sz(c); i++)
    {
        update(seg,0,pot-1,i,i,fin[i]);
    }
    
    for (i = sz(l)-1; i >=0; i--)
    {
        roots[i]=new nodo();
        if (i<sz(l)-1)
            create(roots[i], roots[i + 1]);
        else
            create(roots[i], seg);
        update(roots[i],0,pot-1,l[i], r[i], -v[i]);
    }
    roots[sz(r)]=seg;
    vector<int>ans(sz(c));
    for(i=0; i<sz(c); i++)
    {
        ll L=0, R=sz(r), piv, pos=sz(r), j;
        while(L<=R)
        {
            piv=(L+R)/2;
            if(calcMa(roots[piv],0,pot-1,i,i)-calcMi(roots[piv],0,pot-1,i,i)>=1ll*c[i])
            {
                L=piv+1;
                pos=piv;
            }
            else
                R=piv-1;
        }

        if(calc(roots[pos],0,pot-1,i,i)==calcMi(roots[pos],0,pot-1,i,i))
            ans[i]=c[i]-int(calcMa(roots[pos],0,pot-1,i,i)-fin[i]);
        else
            ans[i]=int(fin[i]-calcMi(roots[pos],0,pot-1,i,i));

        /*cout << i << '\n';
        for(j=0; j<=sz(r); j++)
        {
            cout << calcMa(roots[j],0,pot-1,i,i) << ' ' << calcMi(roots[j],0,pot-1,i,i) << '\n';
        }
        cout << '\n';*/
    }
    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...