답안 #434975

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
434975 2021-06-22T17:18:34 Z model_code 사탕 분배 (IOI21_candies) C++17
100 / 100
1958 ms 62324 KB
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1000000 + 10;
const int MAXQ = 1000000 + 10;
const long long INF = (long long)(1e18);

struct SegmentTree {
    int n;
    long long vmin[(MAXN + MAXQ) * 4], vmax[(MAXN + MAXQ) * 4], lazy[(MAXN + MAXQ) * 4];

    void init(int _n) {
        n = _n;
        for(int i = 0; i <= 4 * n; ++i) vmin[i] = vmax[i] = lazy[i] = 0;
    }

    void lazy_update(int node, int from, int to) {
        vmin[node] += lazy[node]; vmax[node] += lazy[node];
        if (from < to) {
            lazy[node * 2] += lazy[node];
            lazy[node * 2 + 1] += lazy[node];
        }
        lazy[node] = 0;
    }

    void update(int node, int from, int to, int L, int R, int add) {
        lazy_update(node, from, to);
        if (from > R || to < L) return;
        if (L <= from && to <= R) {
            lazy[node] += add;
            lazy_update(node, from, to);
            return;
        }
        int mid = (from + to) / 2;
        update(node * 2, from, mid, L, R, add);
        update(node * 2 + 1, mid + 1, to, L, R, add);
        vmin[node] = min(vmin[node * 2], vmin[node * 2 + 1]);
        vmax[node] = max(vmax[node * 2], vmax[node * 2 + 1]);
    }

    long long get(int node, int from, int to, int lowerbound) {
        lazy_update(node, from, to);
        if (from == to) return vmin[node];
        int mid = (from + to) / 2;
        if (vmax[node * 2 + 1] + lazy[node * 2 + 1] >= lowerbound)
            return get(node * 2 + 1, mid + 1, to, lowerbound);
        return min( vmin[node * 2 + 1] + lazy[node * 2 + 1], get(node * 2, from, mid, lowerbound) );
    }

    void add_range(int L, int R, int add) {
        update(1, 0, n - 1, L, R, add);
    }

    long long min_suffix(int lowerbound) {
        if (vmax[1] < lowerbound) return -INF;
        return min(0LL, get(1, 0, n - 1, lowerbound));
    }
} T;

vector<int> distribute_candies(vector<int> C, vector<int> L, vector<int> R, vector<int> V) {
    int n = C.size();
    vector<int> A(n);
    int q = L.size();
    vector< vector<int> > begin_at(n, vector<int>()), end_at(n, vector<int>());
    for(int i = 0; i < q; ++i) {
        begin_at[L[i]].push_back(i);
        end_at[R[i]].push_back(i);
    }

    T.init(n + q);
    vector<int> final_A(n);
    for(int i = 0; i < n; ++i) {
        if (i > 0) {
            T.add_range(0, i - 1, -A[i - 1]);
            for(int j : end_at[i - 1]) T.add_range(0, n + j, -V[j]);
        }
        T.add_range(0, i, A[i]);
        for(int j : begin_at[i]) T.add_range(0, n + j, V[j]);

        int low = 1, high = C[i] + 1;
        while (low <= high) {
            int mid = (low + high) / 2;
            long long smin = T.min_suffix(mid);
            if (-smin + mid > C[i]) high = mid - 1;
            else low = mid + 1;
        }
        final_A[i] = high;
    }

    return final_A;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 208 KB Output is correct
2 Correct 1 ms 208 KB Output is correct
3 Correct 2 ms 588 KB Output is correct
4 Correct 2 ms 588 KB Output is correct
5 Correct 6 ms 848 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1425 ms 62312 KB Output is correct
2 Correct 1332 ms 62324 KB Output is correct
3 Correct 1506 ms 62324 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 460 KB Output is correct
2 Correct 414 ms 26980 KB Output is correct
3 Correct 701 ms 31996 KB Output is correct
4 Correct 1549 ms 62308 KB Output is correct
5 Correct 1675 ms 62308 KB Output is correct
6 Correct 1958 ms 62316 KB Output is correct
7 Correct 926 ms 62312 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 2 ms 460 KB Output is correct
3 Correct 169 ms 25908 KB Output is correct
4 Correct 485 ms 31912 KB Output is correct
5 Correct 634 ms 56932 KB Output is correct
6 Correct 680 ms 56932 KB Output is correct
7 Correct 895 ms 56928 KB Output is correct
8 Correct 642 ms 56932 KB Output is correct
9 Correct 1190 ms 56928 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 208 KB Output is correct
2 Correct 1 ms 208 KB Output is correct
3 Correct 2 ms 588 KB Output is correct
4 Correct 2 ms 588 KB Output is correct
5 Correct 6 ms 848 KB Output is correct
6 Correct 1425 ms 62312 KB Output is correct
7 Correct 1332 ms 62324 KB Output is correct
8 Correct 1506 ms 62324 KB Output is correct
9 Correct 2 ms 460 KB Output is correct
10 Correct 414 ms 26980 KB Output is correct
11 Correct 701 ms 31996 KB Output is correct
12 Correct 1549 ms 62308 KB Output is correct
13 Correct 1675 ms 62308 KB Output is correct
14 Correct 1958 ms 62316 KB Output is correct
15 Correct 926 ms 62312 KB Output is correct
16 Correct 1 ms 204 KB Output is correct
17 Correct 2 ms 460 KB Output is correct
18 Correct 169 ms 25908 KB Output is correct
19 Correct 485 ms 31912 KB Output is correct
20 Correct 634 ms 56932 KB Output is correct
21 Correct 680 ms 56932 KB Output is correct
22 Correct 895 ms 56928 KB Output is correct
23 Correct 642 ms 56932 KB Output is correct
24 Correct 1190 ms 56928 KB Output is correct
25 Correct 1 ms 204 KB Output is correct
26 Correct 404 ms 32004 KB Output is correct
27 Correct 634 ms 26960 KB Output is correct
28 Correct 1270 ms 62308 KB Output is correct
29 Correct 1258 ms 62320 KB Output is correct
30 Correct 1346 ms 62312 KB Output is correct
31 Correct 1361 ms 62312 KB Output is correct
32 Correct 1347 ms 62312 KB Output is correct