답안 #435788

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
435788 2021-06-23T17:58:09 Z bicsi 사탕 분배 (IOI21_candies) C++17
38 / 100
3534 ms 1048580 KB
#include "candies.h"
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
const int bs = 256;

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

  vector<int> f(n, 0), nf(n, 0);
  vector<vector<ll>> ops(n / bs + 1);
  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];
    });
  }
  auto refresh = [&](int bi) {
    if (ops[bi].empty()) return;

    // cerr << "refresh: " << bi << endl;
    // cerr << "ops: ";
    // for (auto x : ops[bi]) cerr << x << " "; cerr << endl;

    vector<ll> stk = {(ll)4e12, (ll)2e12};
    for (auto delta : ops[bi]) {
      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);
            stk.push_back(0);
            stk.push_back(0);
            break;
          }
          rem -= (x - px);
          stk.pop_back();
        }
      }
    }
    reverse(stk.begin(), stk.end());
    // cerr << "stk: "; for (auto x : stk) cerr << x << " "; cerr << endl;

    ll value = 0;
    int ptr = 0;
    for (int i = bi * bs; i < (bi + 1) * bs && i < n; ++i) {
      ll ci = c[order[i]];
      while (stk[ptr + 1] < ci) {
        if (ptr % 2 == 0)
          value += stk[ptr + 1] - stk[ptr];
        ++ptr;
      }
      if (ptr % 2 == 0) {
        nf[order[i]] = value + (ci - stk[ptr]);
      } else {
        nf[order[i]] = value;
      }
      // cerr << "  " << order[i] << " => " << nf[order[i]] << endl;
    }

    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 = bi * bs; i < (bi + 1) * bs && i < n; ++i) {
      ll hi = min(c[i] - maxd, (ll)f[i]);
      ll lo = -mind;
      if (lo < hi) 
        nf[i] += hi - lo; 
    }


    for (int i = bi * bs; i < (bi + 1) * bs && i < n; ++i) 
      f[i] = nf[i];

    // for (int i = 0; i < n; ++i) cerr << f[i] << " "; cerr << endl;

    ops[bi].clear();
  };

  int q = l.size();
  for (int i = 0; i < q; ++i) {
    int lf = l[i], rt = r[i];
    int bl = l[i] / bs, br = r[i] / bs;
    refresh(bl); refresh(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 {
        f[j] = max(0, min(f[j] + v[i], c[j]));
        j += 1;
      }
    }
  }

  for (int i = 0; i < n; i += bs)
    refresh(i / bs);
  return f;
}

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:108:9: warning: unused variable 'lf' [-Wunused-variable]
  108 |     int lf = l[i], rt = r[i];
      |         ^~
candies.cpp:108:20: warning: unused variable 'rt' [-Wunused-variable]
  108 |     int lf = l[i], rt = r[i];
      |                    ^~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 2 ms 332 KB Output is correct
5 Correct 11 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3170 ms 17524 KB Output is correct
2 Correct 3366 ms 17508 KB Output is correct
3 Correct 3534 ms 17424 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 973 ms 5036 KB Output is correct
3 Correct 97 ms 6972 KB Output is correct
4 Correct 3250 ms 17272 KB Output is correct
5 Correct 3424 ms 17496 KB Output is correct
6 Correct 3061 ms 17588 KB Output is correct
7 Correct 3053 ms 17356 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1087 ms 14616 KB Output is correct
4 Correct 146 ms 16784 KB Output is correct
5 Runtime error 3342 ms 1048580 KB Execution killed with signal 9
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 2 ms 332 KB Output is correct
5 Correct 11 ms 376 KB Output is correct
6 Correct 3170 ms 17524 KB Output is correct
7 Correct 3366 ms 17508 KB Output is correct
8 Correct 3534 ms 17424 KB Output is correct
9 Correct 1 ms 204 KB Output is correct
10 Correct 973 ms 5036 KB Output is correct
11 Correct 97 ms 6972 KB Output is correct
12 Correct 3250 ms 17272 KB Output is correct
13 Correct 3424 ms 17496 KB Output is correct
14 Correct 3061 ms 17588 KB Output is correct
15 Correct 3053 ms 17356 KB Output is correct
16 Correct 1 ms 204 KB Output is correct
17 Correct 1 ms 204 KB Output is correct
18 Correct 1087 ms 14616 KB Output is correct
19 Correct 146 ms 16784 KB Output is correct
20 Runtime error 3342 ms 1048580 KB Execution killed with signal 9
21 Halted 0 ms 0 KB -