Gửi bài giải
Điểm:
1,00 (OI)
Giới hạn thời gian:
1.0s
Giới hạn bộ nhớ:
256M
Input:
stdin
Output:
stdout
Tác giả:
Nguồn bài:
Dạng bài
Ngôn ngữ cho phép
C, C#, C++, Java, Kotlin, Pascal, PyPy, Python, Scratch
Cho mảng A[] gồm N phần tử, nhiệm vụ của bạn là tính tổng của mọi dãy con trong mảng, ví dụ mảng A[] = {1, 2, 3, 4} bạn phải tính tổng của các dãy con : {1}, {1, 2}, {1, 2, 3}, {1, 2, 3, 4}, {2}, {2, 3}, {2, 3, 4}, {3}, {3, 4}, {4}
Đầu vào
Dòng 1 là N : số phần tử trong mảng
Dòng 2 là N phần tử cách nhau 1 khoảng trắng
Giới hạn
1<=N<=1000
0<=A[i]<=1000
Đầu ra
In ra tổng của các dãy con trong mảng
Ví dụ :
Input 01
6
6 0 3 7 9 5
Output 01
6 6 9 16 25 30 0 3 10 19 24 3 10 19 24 7 16 21 9 14 5
Bình luận
include <iostream>
Nhìn thì tưởng "clean" đấy, nhưng thực ra đang cầm dao thái thịt mà đi mổ trâu rồi. accumulate(a+i, a+j+1, 0) bên trong vòng i, j là đang cộng lại nguyên đoạn [i..j] mỗi lần thành ra bạn đang chơi O(n³) chứ không phải O(n²) đâu.
Với bài này, chỉ cần hiểu rõ dãy con liên tiếp là ta có thể dùng 1 biến sum tích lũy nội tuyến trong vòng j để đạt O(n²) thật sự:
for (int i = 0; i < n; ++i) { int sum = 0; for (int j = i; j < n; ++j) { sum += a[j]; cout << sum << " "; } }
Cái gọi là "code sạch" không chỉ nằm ở std:: hay ít dòng mà là ở tư duy giảm lặp, tiết kiệm tài nguyên, giữ logic tinh gọn. Độ phức tạp mới là clean thật sự.
Cứ tưởng accumulate là shortcut xịn, ai ngờ shortcut chạy ngược hướng
FULL AC
Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.