Submission #734019

#TimeUsernameProblemLanguageResultExecution timeMemory
734019benjaminkleyn사탕 분배 (IOI21_candies)C++17
100 / 100
377 ms31484 KiB
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx,avx2,fma,bmi,bmi2")
#include "candies.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

ll M[1000000] = {0}, m[1000000] = {0}, lazy[1000000] = {0};

void push(int v)
{
    M[2 * v] += lazy[v];
    M[2 * v + 1] += lazy[v];

    m[2 * v] += lazy[v];
    m[2 * v + 1] += lazy[v];

    lazy[2 * v] += lazy[v];
    lazy[2 * v + 1] += lazy[v];
    lazy[v] = 0;
}

void update(int v, int tl, int tr, int l, int r, ll dx)
{
    if (r < tl || tr < l)
        return;
    if (l <= tl && tr <= r)
    {
        M[v] += dx;
        m[v] += dx;
        lazy[v] += dx;
        return;
    }

    push(v);
    int tm = (tl + tr) / 2;
    update(2 * v, tl, tm, l, r, dx);
    update(2 * v + 1, tm + 1, tr, l, r, dx);
    M[v] = max(M[2 * v], M[2 * v + 1]);
    m[v] = min(m[2 * v], m[2 * v + 1]);
}

ll Find(int v, int tl, int tr, ll Mx, ll Mn, ll sum, int c)
{
    if (tl == tr)
    {
        if (Mx <= M[v])
            return sum - Mn;
        else
            return c - (Mx - sum);
    }

    push(v);
    int tm = (tl + tr) / 2;
    if (max(Mx, M[2 * v + 1]) - min(Mn, m[2 * v + 1]) <= c)
        return Find(2 * v, tl, tm, max(Mx, M[2 * v + 1]), min(Mn, m[2 * v + 1]), sum, c);
    return Find(2 * v + 1, tm + 1, tr, Mx, Mn, sum, c);
}

vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) 
{
    int n = c.size(), q = v.size();
    vector<vector<pair<int,int>>> events(n+1);
    events[0].push_back({1000000000, -2});
    events[0].push_back({-1000000000, -1});
    for (int i = 0; i < q; i++)
    {
        events[l[i]].push_back({v[i], i});
        events[r[i]+1].push_back({-v[i], i});
    }
    ll sum = 0;
    vector<int> s(n);
    for (int i = 0; i < n; i++)
    {
        for (auto [val, time] : events[i])
        {
            sum += val;
            update(1, 0, q + 1, time + 2, q + 1, val);
        }
        s[i] = Find(1, 0, q + 1, sum, sum, sum, c[i]);
    }

    return s;
}
#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...