Hướng dẫn giải của TS10 TP.HCM 2024 - Lọc nước

Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người làm lời giải.


Nộp code mẫu trước khi tự giải được bài tập là một hành vi có thể bị ban.

Subtask ~2~:

  • Vì ~m~ có thể lên đếm ~10^9~, nên việc nhập toàn bộ các số ~r~ vào mảng là không thể. Ở đây ta cần xử lý từng ~r~ một, khi nào không còn bồn nào còn nước thì dừng ngay.
  • Nhận thấy giá trị lớn nhất của ~a_i~ là ~10^5~ nên số lần đổ nước tối đa chỉ là ~10^5~.

Subtask ~3~:

  • Tương tự subtask ~2~, nhưng giới hạn ~n~ lên đến ~2 \times 10^5~ nên ta cần kết hợp tổng tiền tố và tìm kiếm nhị phân để được trọn số điểm.
Code tham khảo
#include <bits/stdc++.h>
using namespace std;

int a[200001];
long long presum[200005];

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    sort(a, a + n);
    for (int i = 0; i < n; i++) {
        presum[i + 1] = presum[i] + a[i];
    }

    long long tong = 0, nuoc = 0;
    int p = 0, i = 0, r;
    while (i < m && p < n) {
        cin >> r;
        nuoc += r;
        int vt = upper_bound(a + p, a + n, nuoc) - a;
        long long tongMoi = presum[vt] + (n - vt) * nuoc; // Tổng lít nước đã được đổ vào các bồn chứa sau lần đổ này
        cout << tongMoi - tong << ' ';
        tong = tongMoi;
        p = vt;
        i++;
    }

    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.

Hỗ Trợ CLAOJ
QR Code