IOI 2021 - Distributing Candies

Xem PDF



Dạng bài
Ngôn ngữ cho phép
C++
Điểm: 2500 (p) Thời gian: 4.0s Bộ nhớ: 2G Input: bàn phím Output: màn hình

Cô Khong đang chuẩn bị \(n\) hộp kẹo cho học sinh của một ngôi trường gần nhà. Các hộp được đánh số từ \(0\) đến \(n-1\) và ban đầu đều rỗng. Hộp \(i\) (\(0 \le i \le n-1\)) có sức chứa \(c[i]\) viên kẹo.

Cô Khong dành \(q\) ngày để chuẩn bị các hộp kẹo. Vào ngày \(j\) (\(0 \le j \le q-1\)), cô thực hiện một thao tác được xác định bởi ba số nguyên \(l[j]\), \(r[j]\)\(v[j]\), trong đó \(0 \le l[j] \le r[j] \le n-1\)\(v[j] \ne 0\). Với mỗi hộp \(k\) thỏa mãn \(l[j] \le k \le r[j]\):

  • Nếu \(v[j] > 0\), cô Khong thêm lần lượt từng viên kẹo vào hộp \(k\), cho đến khi đã thêm đúng \(v[j]\) viên kẹo hoặc hộp đầy. Nói cách khác, nếu trước thao tác hộp có \(p\) viên kẹo, thì sau thao tác hộp có số viên kẹo là:
\[ \min(c[k], p+v[j]). \]
  • Nếu \(v[j] < 0\), cô Khong lấy lần lượt từng viên kẹo ra khỏi hộp \(k\), cho đến khi đã lấy ra đúng \(-v[j]\) viên kẹo hoặc hộp rỗng. Nói cách khác, nếu trước thao tác hộp có \(p\) viên kẹo, thì sau thao tác hộp có số viên kẹo là:
\[ \max(0, p+v[j]). \]

Nhiệm vụ của bạn là xác định số kẹo trong mỗi hộp sau \(q\) ngày.

Chi tiết cài đặt

Bạn cần cài đặt hàm sau:

C++
std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l,
                                    std::vector<int> r, std::vector<int> v);
  • c: mảng độ dài \(n\). Với \(0 \le i \le n-1\), \(c[i]\) là sức chứa của hộp \(i\).
  • l, r, v: ba mảng độ dài \(q\). Vào ngày \(j\), với \(0 \le j \le q-1\), cô Khong thực hiện thao tác được xác định bởi \(l[j]\), \(r[j]\)\(v[j]\) như mô tả ở trên.
  • Hàm phải trả về một mảng \(s\) độ dài \(n\). Với \(0 \le i \le n-1\), \(s[i]\) phải là số kẹo trong hộp \(i\) sau \(q\) ngày.

Dữ liệu vào

Trình chấm mẫu đọc dữ liệu theo định dạng sau:

  • Dòng \(1\): \(n\).
  • Dòng \(2\): \(c[0]\ c[1]\ \ldots\ c[n-1]\).
  • Dòng \(3\): \(q\).
  • Dòng \(4+j\) (\(0 \le j \le q-1\)): \(l[j]\ r[j]\ v[j]\).

Dữ liệu ra

Trình chấm mẫu in câu trả lời theo định dạng sau:

  • Dòng \(1\): \(s[0]\ s[1]\ \ldots\ s[n-1]\).

Ràng buộc

  • \(1 \le n \le 200\,000\).
  • \(1 \le q \le 200\,000\).
  • \(1 \le c[i] \le 10^9\) với mọi \(0 \le i \le n-1\).
  • \(0 \le l[j] \le r[j] \le n-1\) với mọi \(0 \le j \le q-1\).
  • \(-10^9 \le v[j] \le 10^9\), \(v[j] \ne 0\) với mọi \(0 \le j \le q-1\).

Phân nhóm

Nhóm Điểm Ràng buộc bổ sung
1 3 \(n, q \le 2000\).
2 8 \(v[j] > 0\) với mọi \(0 \le j \le q-1\).
3 27 \(c[0] = c[1] = \cdots = c[n-1]\).
4 29 \(l[j] = 0\)\(r[j] = n-1\) với mọi \(0 \le j \le q-1\).
5 33 Không có ràng buộc bổ sung.

Ví dụ

Ví dụ 1

Lời gọi hàm
distribute_candies([10, 15, 13], [0, 0], [2, 1], [20, -11])
Giá trị trả về
[0, 4, 13]
Giải thích

Hộp \(0\) có sức chứa \(10\) viên kẹo, hộp \(1\) có sức chứa \(15\) viên kẹo và hộp \(2\) có sức chứa \(13\) viên kẹo.

Kết thúc ngày \(0\), hộp \(0\)\(\min(c[0], 0+v[0]) = 10\) viên kẹo, hộp \(1\)\(\min(c[1], 0+v[0]) = 15\) viên kẹo và hộp \(2\)\(\min(c[2], 0+v[0]) = 13\) viên kẹo.

Kết thúc ngày \(1\), hộp \(0\)\(\max(0, 10+v[1]) = 0\) viên kẹo và hộp \(1\)\(\max(0, 15+v[1]) = 4\) viên kẹo. Vì \(2 > r[1]\), số kẹo trong hộp \(2\) không thay đổi. Số kẹo khi kết thúc mỗi ngày được tổng kết như sau:

Ngày Hộp 0 Hộp 1 Hộp 2
0 10 15 13
1 0 4 13

Do đó, hàm phải trả về [0, 4, 13].

Nguồn

IOI 2021, Ngày 1 — Distributing Candies (candies).

Tệp

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.

Kỳ thi: