01/10/2018, 12:26
Giúp đỡ bài tập: Tìm đoạn dài nhất có tổng dương
cho mình hỏi bài này làm như thế nào với ạ.mình nghĩ gần 1 tháng rồi mà vẫn không ra ạ

Bài liên quan
cho mình hỏi bài này làm như thế nào với ạ.mình nghĩ gần 1 tháng rồi mà vẫn không ra ạ
Dùng tổng cộng dồn.
Định nghĩa
s[0] = 0, s[i] = a[1] + a[2] + ... + a[i] = s[i-1] + a[i]
.-> Tổng các số trong đoạn
l, r
=a[l] + a[l+1] + ... + a[r] = s[r] - s[l-1]
-> Tổng các số trong đoạn
l, r
dương <->s[r] > s[l-1]
.từ từ để nghĩ tiếp…
Tìm đoạn dương có chiều dài n, nếu có in ra, kết thúc
Nếu không có, tìm đoạn dương có chiều dài n - 1, nếu có in ra, kết thúc
Nếu không có, tìm đoạn dương có chiều dài n - 2, nếu có in ra, kết thúc
…
Nếu không có, tìm đoạn dương có chiều dài 1, nếu có in ra, kết thúc
Nếu không có, trả lời, kết thúc
Em nghĩ thuật này dễ bị quá thời gian.
Chuyện đó tính sau. Đề bài đâu có giới hạn thời gian
Thế thôi, cứ O(n^2) mà quất.
Ideone.com
Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.
Có thể tìm được trong O(nlogn)
giả sử tính được mảng cộng dồn
s[i] = sum(a[0:i])
dùng 2 mảng phụ
tmp, index
để tính đoạn dài nhất: mảngtmp
này là mảng giảms[i] < tmp.back()
: trước đó không có phần tử nào nhỏ hơn: cập nhật thêm vàotmp
, cập nhậti
vào mảngindex
(để tính độ dài)s[i]
trongtmp
, và sử dụngindex
để tính xem nó có phải là kết quả tốt nhất không. Ở bước này,s[i]
không được thêm vào nữa bởi vì nếu cótmp[j]<s[i]
thì đoạntmp[j] < s[i] <s[k]
sẽ dài hơn.mình mới học nên làm kiểu thủ công: tạo 1 dãy chứa tổng và 1 dãy chưa độ dài các tập con trong chứa các phần tử liên tiếp của mảng A. A có n phần tử thì 2 dãy kia có n(n+1)/2 phần tử. Sau đó duyệt tong[i]>0 để kiếm max của length
Bài này dùng cây BIT/IT để lấy và cập nhật :v
bạn ơi bài này có thuật o(n) không vậy
Thuật O(n log n) khá ổn rồi, O(n) thì quá khó để thực hiện. Mà limit bài này là n = 60000 nên O(n log n) vẫn chạy tốt, cần gì phải O(n).
Bạn có thể dùng BIT or IT để làm. Với IT(x) là vị trí nhỏ nhất có tổng lớn nhỏ hoặc bằng x update thì khi tới vị trí i có tổng là K thì update từ âm vô cùng đến K , với tổng k đó thì mình querý từ âm vô cùng đến K . NlogN
Thuật có chắc chắn đúng không bạn? Và bạn có chứng minh được thuật của bạn chỉ là O(n) hay không?
Chủ thớt có thể ghi lại đề bài được ko ? Ko hiểu sao ko thể load được ảnh …
Cho a[1…n] thỏa n <= 60000 và abs(a[i]) <= 10000, đặt sum_ij = a[i] + a[i+1] + … + a[j]. Trong các (j, i) để sum_ij > 0, cực đại j - i.