Solutions of Subarray - MarisaOJ: Marisa Online Judge

Solutions of Subarray

Select solution language

Write solution here.


User Avatar menkh    Created at    17 likes

Đối với bài toán này, ta không thể áp dụng binary search một cách đơn thuần được, vì mảng có chứa số âm nên prefix sum sẽ không đơn điệu. Theo yêu cầu đề bài, ta có: pref[j]pref[i1]S pref[i1]pref[j]S Lúc này với mọi chỉ số i thoả mãn, ta sẽ lấy chỉ số i nhỏ nhất thoả mãn đồng thời pref[i1] phải đủ lớn để thoả pref[i1]pref[j]S. Nhận thấy rằng, nếu có hai chỉ số i1<i2pref[i1]pref[i2], thì ta sẽ luôn luôn chọn chỉ số i1i1 nhỏ hơn, đồng thời vẫn đủ lớn để thoả điều kiện. Đơn giản là vì nếu giá trị cực đại của pref[i1] không thoả mãn pref[i1]pref[j]S, thì sẽ không có bất cứ giá trị nào mà bé hơn pref[i1] thoả mãn được cả. Từ quan sát trên, gọi candidate[] là danh sách gồm các giá trị pref[i] có thể thoả mãn. Ban đầu, candidate[0]=0. Và với mỗi chỉ số 0<in, ta sẽ đẩy i vào danh sách nếu pref[i] lớn hơn giá trị pref[j] cực đại trong candidate. Từ đây candidate[] chỉ gồm các giá trị pref[j] tăng dần. Lúc này ta có thể áp dụng binary search để tìm pref[i1] nhỏ nhất thoả mãn pref[i1]pref[j]S Độ phức tạp: O(nlog(n))