답안 #558917

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
558917 2022-05-09T01:14:35 Z nghiass001 사탕 분배 (IOI21_candies) C++17
100 / 100
425 ms 34192 KB
#include "candies.h"
#include <bits/stdc++.h>
#define FOR(i,l,r) for(int i=(l); i<=(r); ++i)
#define REP(i,l,r) for(int i=(l); i<(r); ++i)
#define FORD(i,r,l) for(int i=(r); i>=(l); --i)
#define REPD(i,r,l) for(int i=(r)-1; i>=(l); --i)
using namespace std;
const int N = 2e5 + 5;
int n, q;
long long lazy[N * 4], vmin[N * 4], vmax[N * 4];
long long minF, maxF;
vector<int> Q[N];

void down(int range, int pos) {
    if (lazy[pos]) {
        vmin[pos] += lazy[pos];
        vmax[pos] += lazy[pos];
        if (range) {
            lazy[pos * 2] += lazy[pos];
            lazy[pos * 2 + 1] += lazy[pos];
        }
        lazy[pos] = 0;
    }
}

void update(int x, int y, int val, int l = 0, int r = q, int pos = 1) {
    if (x > r || y < l || x > y) return;
    if (x <= l && r <= y) {
        lazy[pos] += val;
        return;
    }
    down(r - l, pos);
    int mid = (l + r) / 2;
    update(x, y, val, l, mid, pos * 2);
    update(x, y, val, mid + 1, r, pos * 2 + 1);
    vmin[pos] = min(vmin[pos * 2] + lazy[pos * 2], vmin[pos * 2 + 1] + lazy[pos * 2 + 1]);
    vmax[pos] = max(vmax[pos * 2] + lazy[pos * 2], vmax[pos * 2 + 1] + lazy[pos * 2 + 1]);
}

int query(int diff, int l = 0, int r = q, int pos = 1) {
    down(r - l, pos);
    if (max(maxF, vmax[pos]) - min(minF, vmin[pos]) < diff) {
        maxF = max(maxF, vmax[pos]);
        minF = min(minF, vmin[pos]);
        return l - 1;
    }
    if (l == r) {
        maxF = max(maxF, vmax[pos]);
        minF = min(minF, vmin[pos]);
        if (maxF == vmax[pos]) maxF = minF + diff;
        else minF = maxF - diff;
        return l;
    }

    int mid = (l + r) / 2;
    int tmp = query(diff, mid + 1, r, pos * 2 + 1);
    if (tmp > mid) return tmp;
    return query(diff, l, mid, pos * 2);
}

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

    REP(i, 0, q) {
        Q[l[i]].push_back(i);
        Q[r[i] + 1].push_back(i + q);
    }

    REP(i, 0, n) {
        for(int id : Q[i]) {
            if (id < q) update(0, id, v[id]);
            else update(0, id - q, -v[id - q]);
        }
        minF = maxF = 0;
        int tmp = query(c[i]);
        ans[i] = maxF;
    }

    return ans;
}

Compilation message

candies.cpp: In function 'std::vector<int> distribute_candies(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
candies.cpp:78:13: warning: unused variable 'tmp' [-Wunused-variable]
   78 |         int tmp = query(c[i]);
      |             ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 5012 KB Output is correct
3 Correct 5 ms 5204 KB Output is correct
4 Correct 4 ms 5204 KB Output is correct
5 Correct 7 ms 5204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 397 ms 30696 KB Output is correct
2 Correct 370 ms 34044 KB Output is correct
3 Correct 396 ms 33812 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 236 ms 21348 KB Output is correct
3 Correct 75 ms 10940 KB Output is correct
4 Correct 405 ms 31812 KB Output is correct
5 Correct 411 ms 33572 KB Output is correct
6 Correct 371 ms 32696 KB Output is correct
7 Correct 338 ms 32132 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 5008 KB Output is correct
2 Correct 3 ms 4948 KB Output is correct
3 Correct 115 ms 20968 KB Output is correct
4 Correct 70 ms 8672 KB Output is correct
5 Correct 162 ms 26052 KB Output is correct
6 Correct 174 ms 26624 KB Output is correct
7 Correct 191 ms 26868 KB Output is correct
8 Correct 166 ms 25916 KB Output is correct
9 Correct 202 ms 26924 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 5012 KB Output is correct
3 Correct 5 ms 5204 KB Output is correct
4 Correct 4 ms 5204 KB Output is correct
5 Correct 7 ms 5204 KB Output is correct
6 Correct 397 ms 30696 KB Output is correct
7 Correct 370 ms 34044 KB Output is correct
8 Correct 396 ms 33812 KB Output is correct
9 Correct 3 ms 4948 KB Output is correct
10 Correct 236 ms 21348 KB Output is correct
11 Correct 75 ms 10940 KB Output is correct
12 Correct 405 ms 31812 KB Output is correct
13 Correct 411 ms 33572 KB Output is correct
14 Correct 371 ms 32696 KB Output is correct
15 Correct 338 ms 32132 KB Output is correct
16 Correct 3 ms 5008 KB Output is correct
17 Correct 3 ms 4948 KB Output is correct
18 Correct 115 ms 20968 KB Output is correct
19 Correct 70 ms 8672 KB Output is correct
20 Correct 162 ms 26052 KB Output is correct
21 Correct 174 ms 26624 KB Output is correct
22 Correct 191 ms 26868 KB Output is correct
23 Correct 166 ms 25916 KB Output is correct
24 Correct 202 ms 26924 KB Output is correct
25 Correct 3 ms 5004 KB Output is correct
26 Correct 70 ms 8780 KB Output is correct
27 Correct 247 ms 23352 KB Output is correct
28 Correct 350 ms 33600 KB Output is correct
29 Correct 390 ms 34192 KB Output is correct
30 Correct 391 ms 34152 KB Output is correct
31 Correct 398 ms 33112 KB Output is correct
32 Correct 425 ms 31700 KB Output is correct