Submission #1213396

#TimeUsernameProblemLanguageResultExecution timeMemory
1213396omsincoconutDistributing Candies (IOI21_candies)C++17
0 / 100
310 ms20012 KiB
#include "candies.h"
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 2e5+5, MAXT = 4*MAXN+10;

int C;

pair<int, int> merge(pair<int, int> a, pair<int, int> b) {
    if (a.second >= b.first) return make_pair(a.first, min(C, a.second-b.first+b.second));
    else return make_pair(a.first-a.second+b.first, min(C, b.second));
}

vector<pair<int, int>> tree(MAXT), lazy(MAXT);

void push(int v, int l, int r) {
    tree[v] = merge(tree[v], lazy[v]);
    if (l < r) {
        lazy[v<<1] = merge(lazy[v<<1], lazy[v]);
        lazy[(v<<1)+1] = merge(lazy[(v<<1)+1], lazy[v]);
    }
    lazy[v] = make_pair(0, 0);
}

void update(int l, int r, pair<int, int> val, int tl = 0, int tr = MAXN, int v = 1) {
    push(v, tl, tr);
    if (l <= tl && tr <= r) {
        lazy[v] = merge(lazy[v], val);
        push(v, tl, tr);
        return;
    }

    if (l > tr || tl > r) return;
    int mid = (tl+tr)>>1;
    update(l, r, val, tl, mid, v<<1);
    update(l, r, val, mid+1, tr, (v<<1)+1);
    tree[v] = merge(tree[v<<1], tree[(v<<1)+1]);
}

pair<int, int> query(int x, int tl = 0, int tr = MAXN, int v = 1) {
    push(v, tl, tr);
    if (tl == tr) return tree[v];
    int mid = (tl+tr)>>1;
    if (x <= mid) return query(x, tl, mid, v<<1);
    else return query(x, mid+1, tr, (v<<1)+1);
}

vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) {
    int n = c.size(), q = l.size();
    C = c[0];

    for (int i = 0; i < q; i++) {
        if (v[i] > 0) update(l[i], r[i], {0, v[i]});
        else update(l[i], r[i], {-v[i], 0});
    }

    vector<int> s(n);
    for (int i = 0; i < n; i++) s[i] = query(i).second;
    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...