Hướng giải của Alien nâng cao


Nhớ rằng hướng dẫn giải này chỉ nên sử dụng khi bế tắc, và tuyệt đối không nên sao chép mã nguồn kèm theo. Hãy tôn trọng tác giả bài tập và người viết hướng dẫn giải.
Nộp mã nguồn lời giải chính thức trước khi giải bài tập đó có thể khiến bạn bị ban.

Tác giả: kienadmin

Lời giải: Alien nâng cao

Phân tích

Dùng Alien's trick (Lagrangian relaxation / WQS Binary Search) để chuyển bài toán "chính xác K đoạn" thành bài toán không giới hạn số đoạn, thêm phạt \(\lambda\) cho mỗi đoạn.

Dùng hai deque để duy trì min/max sliding window khi tính cost, kết hợp Convex Hull Trick (CHT) để tối ưu DP \(O(N)\).

Độ phức tạp

\(O(N \log MAX)\) với \(MAX\) là khoảng giá trị \(\lambda\).

Code mẫu C++

// Giải thuật opt cho bài toán opt-alien-pro\n#include <bits/stdc++.h>
using namespace std;

const int N = 300005;
int n, k, a[N];

pair<long long, int> solve(long long lambda) {
    // DP voi chi phi mo rong: cost = lambda cho moi doan
    // Tra ve (cost_min, so_doan)
    return {0, 0};
}

int main() {
    // Doc du lieu dau vao
    ios::sync_with_stdio(false); cin.tie(0);
    cin >> n >> k;
    for (int i = 1; i <= n; ++i) cin >> a[i];
    long long l = 0, r = 1e18, ans = 0;
    while (l <= r) {
        long long mid = (l + r) / 2;
        auto [val, cnt] = solve(mid);
        if (cnt >= k) { ans = val - mid * k; l = mid + 1; }
        else r = mid - 1;
    }
    cout << ans << "\n";
    return 0;
}

Nhận xét

Không có ý kiến tại thời điểm này.