답안 #649100

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
649100 2022-10-09T10:13:22 Z ponkung 사탕 분배 (IOI21_candies) C++17
100 / 100
3138 ms 495168 KB
#include "candies.h"
#include <bits/stdc++.h>
 
using namespace std;
using ll = long long;
const int BS = 333;
 
 
vector<ll> compute_function(const vector<int>& ops) {
  vector<ll> stk;
  stk.push_back(4e18);
  stk.push_back(2e18);
  for (auto delta : ops) {
    if (delta == 0) continue;
    if (delta > 0) {
      ll rem = delta, px = 0;
      while (true) {
        ll x = stk.back();
        if (x - px > rem) {
          stk.push_back(px + rem);
          stk.push_back(0);
          break;
        } 
        rem -= (x - px);
        stk.pop_back();
        px = stk.back();
        stk.pop_back();
      }
    } else {
      ll rem = -delta;
      while (true) {
        ll px = stk.back(); stk.pop_back();
        ll x = stk.back();
        if (x - px > rem) {
          stk.push_back(px + rem);
          break;
        }
        rem -= (x - px);
        stk.pop_back();
      }
    }
  }
  
  stk.push_back(0);
  stk.push_back(0);
  reverse(stk.begin(), stk.end());
  return stk;
}
 
vector<int> distribute_candies(
    vector<int> c, vector<int> l,
    vector<int> r, vector<int> v) {
  int n = c.size();
 
  
  // Sort each bucket increasingly by c[i] to facilitate easy evaluation of f.
  vector<int> order(n);
  iota(order.begin(), order.end(), 0);
  for (int i = 0; i < n; i += BS) {
    int j = min(i + BS, n);
    sort(order.begin() + i, order.begin() + j, [&](int a, int b) {
      return c[a] < c[b];
    });
  }
 
  vector<ll> stk;
  vector<int> a(n, 0), na(n, 0);
  vector<vector<int>> ops(n / BS + 1);
 
  auto commit = [&](int bi) {
    if (ops[bi].empty()) return;
    int l = bi * BS, r = min(n, (bi + 1) * BS);
 
    // compute f(.) and evaluate it in all c[i] of this bucket
    auto stk = compute_function(ops[bi]);
    ll value = 0;
    int ptr = 0;
    for (int i = l; i < r; ++i) {
      int ci = c[order[i]];
      while (stk[ptr + 1] < ci) {
        if (ptr % 2 == 0)
          value += stk[ptr + 1] - stk[ptr];
        ++ptr;
      }
      if (ptr % 2 == 0) {
        na[order[i]] = value + (ci - stk[ptr]);
      } else {
        na[order[i]] = value;
      }
    }
  
    // Adapt for non-zero initial values.
    ll mind = 0, maxd = 0, nowd = 0;
    for (auto x : ops[bi]) {
      nowd += x;
      mind = min(mind, nowd);
      maxd = max(maxd, nowd);
    }
    for (int i = l; i < r; ++i) {
      ll hi = min(c[i] - maxd, (ll)a[i]);
      ll lo = -mind;
      if (lo < hi) 
        na[i] += hi - lo; 
    }
 
    // Housekeeping.
    for (int i = l; i < r; ++i) 
      a[i] = na[i];
    ops[bi].clear();
  };
 
  int q = l.size();
  for (int i = 0; i < q; ++i) {
    int bl = l[i] / BS, br = r[i] / BS;
    commit(bl); commit(br); 
    for (int j = l[i]; j <= r[i]; ) {
      if (j % BS == 0 && (j + BS - 1) <= r[i]) {
        ops[j / BS].push_back(v[i]);
        j += BS;
      } else {
        a[j] = max(0, min(a[j] + v[i], c[j]));
        j += 1;
      }
    }
  }
 
  for (int i = 0; i < n; i += BS)
    commit(i / BS);
  return a;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 308 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 7 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1998 ms 16584 KB Output is correct
2 Correct 2147 ms 15768 KB Output is correct
3 Correct 2003 ms 15688 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 519 ms 8016 KB Output is correct
3 Correct 88 ms 7372 KB Output is correct
4 Correct 1805 ms 17700 KB Output is correct
5 Correct 1748 ms 18064 KB Output is correct
6 Correct 1729 ms 18328 KB Output is correct
7 Correct 1591 ms 17708 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 292 KB Output is correct
3 Correct 520 ms 12044 KB Output is correct
4 Correct 79 ms 10284 KB Output is correct
5 Correct 3114 ms 493988 KB Output is correct
6 Correct 3043 ms 494460 KB Output is correct
7 Correct 3138 ms 494844 KB Output is correct
8 Correct 3107 ms 493652 KB Output is correct
9 Correct 2267 ms 495168 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 308 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 7 ms 340 KB Output is correct
6 Correct 1998 ms 16584 KB Output is correct
7 Correct 2147 ms 15768 KB Output is correct
8 Correct 2003 ms 15688 KB Output is correct
9 Correct 1 ms 212 KB Output is correct
10 Correct 519 ms 8016 KB Output is correct
11 Correct 88 ms 7372 KB Output is correct
12 Correct 1805 ms 17700 KB Output is correct
13 Correct 1748 ms 18064 KB Output is correct
14 Correct 1729 ms 18328 KB Output is correct
15 Correct 1591 ms 17708 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 1 ms 292 KB Output is correct
18 Correct 520 ms 12044 KB Output is correct
19 Correct 79 ms 10284 KB Output is correct
20 Correct 3114 ms 493988 KB Output is correct
21 Correct 3043 ms 494460 KB Output is correct
22 Correct 3138 ms 494844 KB Output is correct
23 Correct 3107 ms 493652 KB Output is correct
24 Correct 2267 ms 495168 KB Output is correct
25 Correct 1 ms 212 KB Output is correct
26 Correct 75 ms 6452 KB Output is correct
27 Correct 593 ms 7768 KB Output is correct
28 Correct 2436 ms 16344 KB Output is correct
29 Correct 2246 ms 16696 KB Output is correct
30 Correct 1966 ms 17048 KB Output is correct
31 Correct 1911 ms 17076 KB Output is correct
32 Correct 1737 ms 17432 KB Output is correct