답안 #435794

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
435794 2021-06-23T18:03:23 Z bicsi 사탕 분배 (IOI21_candies) C++17
38 / 100
3574 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];
    });
  }
  vector<ll> stk;
  auto refresh = [&](int bi) {
    if (ops[bi].empty()) return;
 
    // cerr << "refresh: " << bi << endl;
    // cerr << "ops: ";
    // for (auto x : ops[bi]) cerr << x << " "; cerr << endl;
    stk.clear();
    stk.push_back(4e18);
    stk.push_back(2e18);
    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);
            break;
          }
          rem -= (x - px);
          stk.pop_back();
        }
      }
    }
    
    stk.push_back(0);
    stk.push_back(0);
    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:111:9: warning: unused variable 'lf' [-Wunused-variable]
  111 |     int lf = l[i], rt = r[i];
      |         ^~
candies.cpp:111:20: warning: unused variable 'rt' [-Wunused-variable]
  111 |     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 3172 ms 17636 KB Output is correct
2 Correct 3574 ms 17540 KB Output is correct
3 Correct 3527 ms 17288 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 969 ms 5032 KB Output is correct
3 Correct 98 ms 7020 KB Output is correct
4 Correct 3326 ms 17284 KB Output is correct
5 Correct 3196 ms 17528 KB Output is correct
6 Correct 2927 ms 17416 KB Output is correct
7 Correct 2842 ms 17416 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 1267 ms 14624 KB Output is correct
4 Correct 136 ms 16816 KB Output is correct
5 Runtime error 3271 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 3172 ms 17636 KB Output is correct
7 Correct 3574 ms 17540 KB Output is correct
8 Correct 3527 ms 17288 KB Output is correct
9 Correct 1 ms 204 KB Output is correct
10 Correct 969 ms 5032 KB Output is correct
11 Correct 98 ms 7020 KB Output is correct
12 Correct 3326 ms 17284 KB Output is correct
13 Correct 3196 ms 17528 KB Output is correct
14 Correct 2927 ms 17416 KB Output is correct
15 Correct 2842 ms 17416 KB Output is correct
16 Correct 1 ms 204 KB Output is correct
17 Correct 1 ms 204 KB Output is correct
18 Correct 1267 ms 14624 KB Output is correct
19 Correct 136 ms 16816 KB Output is correct
20 Runtime error 3271 ms 1048580 KB Execution killed with signal 9
21 Halted 0 ms 0 KB -