답안 #546845

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
546845 2022-04-08T16:21:08 Z Trisanu_Das 사탕 분배 (IOI21_candies) C++17
100 / 100
1069 ms 32196 KB
#include "candies.h"
#include <bits/stdc++.h>
 
struct SqrtDecomp{
  int n;
  int bucket_size, bucket_cnt;
  std::vector<int> vals;
  std::vector<long long> mini, maxi, sums;
  SqrtDecomp(int _n): n(_n) {
    bucket_size = sqrt(n);
    bucket_cnt = (n + bucket_size - 1) / bucket_size;
    vals.assign(n, 0);
    mini.assign(bucket_cnt, 0);
    maxi.assign(bucket_cnt, 0);
    sums.assign(bucket_cnt, 0);
  }
 
  void upd(int x, int val) {
    vals[x] = val;
    int bucket = x / bucket_size;
 
    mini[bucket] = maxi[bucket] = sums[bucket] = 0;
    for (int i = std::min(n, (bucket + 1) * bucket_size) - 1; 
         i >= bucket * bucket_size; --i) {
      sums[bucket] += vals[i];
      maxi[bucket] = std::max(maxi[bucket], sums[bucket]);
      mini[bucket] = std::min(mini[bucket], sums[bucket]);
    }
  }
 
  std::tuple<int, int, int> query(int c) {
    int sufsum = 0, sufmin = 0, sufmax = 0;
    for (int bucket = bucket_cnt - 1; bucket >= 0; --bucket) {
      long long nsufsum = sufsum + sums[bucket],
                nsufmin = std::min(1LL * sufmin, sufsum + mini[bucket]),
                nsufmax = std::max(1LL * sufmax, sufsum + maxi[bucket]);
      if (nsufmax - nsufmin > c) {
        for (int i = std::min(n, (bucket + 1) * bucket_size) - 1; 
             i >= bucket * bucket_size; --i) {
          sufsum += vals[i];
          sufmin = std::min(sufmin, sufsum);
          sufmax = std::max(sufmax, sufsum);
          if (sufmax - sufmin > c) return std::make_tuple(sufmin, sufmax, i);
        }
      }
      sufsum = nsufsum; sufmax = nsufmax; sufmin = nsufmin;
    }
    return std::make_tuple(sufmin, sufmax, 0);
  }
 
  inline int at(int x) { return vals[x]; }
};
 
std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l,
                                    std::vector<int> r, std::vector<int> v) {
  int n = c.size(), q = v.size();
  std::vector<std::vector<std::pair<int, int>>> queriesL(n), queriesR(n);
  for (int i = 0; i < q; ++i) {
    queriesL[l[i]].emplace_back(i, v[i]);
    queriesR[r[i]].emplace_back(i, v[i]);
  }
 
  std::vector<int> s(n);
  SqrtDecomp tree(q);
  for (int i = 0; i < n; ++i) {
    for (auto [idx, val] : queriesL[i]) {
      tree.upd(idx, -val);
    }
 
    auto [mini, maxi, idx] = tree.query(c[i]);
    if (maxi - mini <= c[i]) {
      s[i] = -mini;
    } else {
      if (tree.at(idx) < 0) {
        s[i] = c[i] - maxi;
      } else {
        s[i] = -mini;
      }
    }
 
    for (auto [idx, val] : queriesR[i]) {
      tree.upd(idx, 0);
    }
  }
 
  return s;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 2 ms 340 KB Output is correct
4 Correct 2 ms 340 KB Output is correct
5 Correct 2 ms 468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 899 ms 25488 KB Output is correct
2 Correct 878 ms 25528 KB Output is correct
3 Correct 900 ms 29412 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 729 ms 11464 KB Output is correct
3 Correct 80 ms 12116 KB Output is correct
4 Correct 1069 ms 25576 KB Output is correct
5 Correct 1008 ms 31944 KB Output is correct
6 Correct 932 ms 32196 KB Output is correct
7 Correct 957 ms 31528 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 756 ms 9052 KB Output is correct
4 Correct 79 ms 12140 KB Output is correct
5 Correct 898 ms 20688 KB Output is correct
6 Correct 869 ms 24888 KB Output is correct
7 Correct 836 ms 25452 KB Output is correct
8 Correct 924 ms 24092 KB Output is correct
9 Correct 1052 ms 25584 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 2 ms 340 KB Output is correct
4 Correct 2 ms 340 KB Output is correct
5 Correct 2 ms 468 KB Output is correct
6 Correct 899 ms 25488 KB Output is correct
7 Correct 878 ms 25528 KB Output is correct
8 Correct 900 ms 29412 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 729 ms 11464 KB Output is correct
11 Correct 80 ms 12116 KB Output is correct
12 Correct 1069 ms 25576 KB Output is correct
13 Correct 1008 ms 31944 KB Output is correct
14 Correct 932 ms 32196 KB Output is correct
15 Correct 957 ms 31528 KB Output is correct
16 Correct 0 ms 212 KB Output is correct
17 Correct 1 ms 340 KB Output is correct
18 Correct 756 ms 9052 KB Output is correct
19 Correct 79 ms 12140 KB Output is correct
20 Correct 898 ms 20688 KB Output is correct
21 Correct 869 ms 24888 KB Output is correct
22 Correct 836 ms 25452 KB Output is correct
23 Correct 924 ms 24092 KB Output is correct
24 Correct 1052 ms 25584 KB Output is correct
25 Correct 1 ms 212 KB Output is correct
26 Correct 80 ms 13436 KB Output is correct
27 Correct 684 ms 14108 KB Output is correct
28 Correct 899 ms 30044 KB Output is correct
29 Correct 863 ms 30540 KB Output is correct
30 Correct 839 ms 30700 KB Output is correct
31 Correct 837 ms 30740 KB Output is correct
32 Correct 812 ms 31152 KB Output is correct