제출 #623280

#제출 시각아이디문제언어결과실행 시간메모리
623280Hanksburger사탕 분배 (IOI21_candies)C++17
100 / 100
369 ms38992 KiB
#include "candies.h"
#include <bits/stdc++.h>
using namespace std;
long long seg[800005], mx[800005], mn[800005];
vector<long long> vec[200005];
vector<int> ans;
void update(long long i, long long l, long long r, long long x, long long y)
{
    if (l==r)
    {
        seg[i]=mx[i]=mn[i]=y;
        return;
    }
    long long mid=(l+r)/2;
    if (x<=mid)
        update(i*2, l, mid, x, y);
    else
        update(i*2+1, mid+1, r, x, y);
    seg[i]=seg[i*2]+seg[i*2+1];
    mx[i]=max(mx[i*2], seg[i*2]+mx[i*2+1]);
    mn[i]=min(mn[i*2], seg[i*2]+mn[i*2+1]);
}
long long query(long long i, long long l, long long r, long long x)
{
//    cout << "query " << i << ' ' << l << ' ' << r << ' ' << x << '\n';
    if (l==r)
        return max(0LL, min(x, seg[i]));
    long long mid=(l+r)/2, res;
    if (mx[i*2+1]-mn[i*2+1]>=x)
        return query(i*2+1, mid+1, r, x);
    res=query(i*2, l, mid, x);
    if (res+mx[i*2+1]>=x)
        return x-(mx[i*2+1]-seg[i*2+1]);
    if (res+mn[i*2+1]<=0)
        return seg[i*2+1]-mn[i*2+1];
    return res+seg[i*2+1];
}
vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v)
{
    long long n=c.size(), q=v.size();
    for (long long i=0; i<q; i++)
    {
        vec[l[i]].push_back(i);
        vec[r[i]+1].push_back(i);
    }
    for (long long i=0; i<n; i++)
    {
        for (long long j:vec[i])
        {
            if (l[j]==i)
            {
                update(1, 0, q-1, j, v[j]);
//                cout << "update " << j << ' ' << v[j] << '\n';
            }
            else
            {
                update(1, 0, q-1, j, 0);
//                cout << "update " << j << ' ' << 0 << '\n';
            }
        }
        ans.push_back(query(1, 0, q-1, c[i]));
    }
    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...