Submission #556010

#TimeUsernameProblemLanguageResultExecution timeMemory
556010HeatDroppa사탕 분배 (IOI21_candies)C++17
100 / 100
1950 ms50824 KiB
    #include <bits/stdc++.h>
    #include "candies.h"
    #define pb push_back
    #define f first
    #define s second
    #define pi acos(-1)
     
    using namespace std;
     
    typedef long long ll;
    typedef long double ld;
     
    const ll oo = 1e18;
    const ld eps = (ld)1 / oo;
    const ll N = 2e5 + 100;
    const ll M = 1e6;
     
    struct tree
    {
        tree *L = NULL;
        tree *R = NULL;
        int l;
        int r;
        int mdl;
        ll lb = 0;
        ll mn = 0;
        ll mx = 0;
     
        tree (int _l, int _r) : l(_l), r(_r)
        {
            mdl = (l + r) >> 1;
            if (l == r) return;
            L = new tree(l, mdl);
            R = new tree(mdl + 1, r);
        }
     
        void push()
        {
            if (lb != 0)
            {
                mx += lb;
                mn += lb;
                if (l != r)
                {
                    L -> lb += lb;
                    R -> lb += lb;
                }
                lb = 0;
            }
        }
     
        void upd(int _l, int _r, int _vl)
        {
            push();
            if (_l > _r) return ;
            if (_l == l && _r == r)
            {
                lb += _vl;
                push();
                return;
            }
            L -> upd(_l, min(mdl, _r), _vl);
            R -> upd(max(mdl + 1, _l), _r, _vl);
            mn = min(L -> mn, R -> mn);
            mx = max(L -> mx, R -> mx);
        }
     
        ll calc_mx(int _l, int _r)
        {
            push();
            if (_l > _r) return -oo;
            if (_l == l && _r == r) return mx;
            return max(L -> calc_mx(_l, min(mdl, _r)), R -> calc_mx(max(mdl + 1, _l), _r));
        }
     
        ll calc_mn(int _l, int _r)
        {
            push();
            if (_l > _r) return oo;
            if (_l == l && _r == r) return mn;
            return min(L -> calc_mn(_l, min(mdl, _r)), R -> calc_mn(max(mdl + 1, _l), _r));
        }
     
    };
     
    std::vector<int> distribute_candies (std::vector<int> c, std::vector<int> l,
                                         std::vector<int> r, std::vector<int> v) {
        int n = c.size();
        int q = l.size();
        vector <pair<int, int> > event[n + 1];
        for (int i = 0; i < q; i++)
        {
            event[l[i]].pb({i + 1, v[i]});
            event[r[i] + 1].pb({i + 1, -v[i]});
        }
        tree *root = new tree(0, q);
        vector <int> ans(n);
        for (int i = 0; i < n; i++)
        {
            for (auto j : event[i]) root -> upd(j.f, q, j.s);
            int l = 0, r = q;
            while (l < r)
            {
                int mdl = (l + r + 1) >> 1;
                if (root -> calc_mx(mdl, q) - root -> calc_mn(mdl, q) < c[i]) r = mdl - 1;
                else l = mdl;
            }
            ll mx = root -> calc_mx(l, q);
            ll mn = root -> calc_mn(l, q);
            if (mx - mn <= c[i])
            {
                ans[i] = root -> calc_mx(q, q) - mn;
                continue;
            }
            else
            {
                ll mx1 = root -> calc_mx(l + 1, q);
                ll mn1 = root -> calc_mn(l + 1, q);
                if (mn < mn1) mn1 = mx1 - c[i];
                ans[i] = root -> calc_mx(q, q) - mn1;
            }
        }
        return ans;
    }
     
    //int main()
    //{
    //    int n;
    //    cin >> n;
    //    vector <int> a(n);
    //    for (int i = 0; i < n; i++) cin >> a[i];
    //    int q;
    //    cin >> q;
    //    vector <int> l(q), r(q), v(q);
    //    for (int i = 0; i < q; i++) cin >> l[i] >> r[i] >> v[i];
    //    vector <int> ans = distribute_candies(a, l, r, v);
    //    for (auto i : ans) cout << i << " ";
    //}
#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...