#include "aliens.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct Line {
    ll a, b;
    int cnt; // count of photos used
    ll eval(ll x) { return a * x + b; }
};
struct CHT {
    deque<Line> dq;
    
    bool bad(Line l1, Line l2, Line l3) {
        return (__int128)(l3.b - l1.b) * (l1.a - l2.a) <= 
               (__int128)(l2.b - l1.b) * (l1.a - l3.a);
    }
    
    void add(Line line) {
        while (!dq.empty() && dq.back().a == line.a) {
            if (dq.back().b >= line.b) dq.pop_back();
            else return;
        }
        
        while (dq.size() >= 2 && 
               bad(dq[dq.size()-2], dq[dq.size()-1], line)) {
            dq.pop_back();
        }
        dq.push_back(line);
    }
    
    pair<ll, int> query(ll x) {
        while (dq.size() >= 2 && 
               dq[0].eval(x) >= dq[1].eval(x)) {
            dq.pop_front();
        }
        return {dq[0].eval(x), dq[0].cnt};
    }
};
ll take_photos(int n, int m, int k, vector<int> r, vector<int> c) {
    vector<pair<int, int>> segs;
    for (int i = 0; i < n; i++) {
        int l = min(r[i], c[i]);
        int rt = max(r[i], c[i]);
        segs.push_back({l, rt});
    }
    
    sort(segs.begin(), segs.end(), [](auto &a, auto &b) {
        if (a.first != b.first) return a.first < b.first;
        return a.second > b.second;
    });
    
    vector<pair<int, int>> intervals;
    int max_right = -1;
    for (auto [l, r] : segs) {
        if (r > max_right) {
            intervals.push_back({l, r});
            max_right = r;
        }
    }
    
    n = intervals.size();
    k = min(k, n);
    
    if (n == 0) return 0;
    auto solve = [&](ll lambda) -> pair<ll, int> {
        CHT cht;
        vector<ll> dp(n + 1, 1e18);
        vector<int> cnt(n + 1, 0);
        
        dp[0] = 0;
        cht.add({-2LL * intervals[0].first, 
                 1LL * intervals[0].first * intervals[0].first + lambda, 1});
        
        for (int i = 0; i < n; i++) {
            ll right = intervals[i].second + 1;
            auto [val, c] = cht.query(right);
            dp[i + 1] = val + 1LL * right * right;
            cnt[i + 1] = c;
            
            if (i + 1 < n) {
                ll overlap = 0;
                if (intervals[i].second >= intervals[i + 1].first) {
                    ll len = intervals[i].second - intervals[i + 1].first + 1;
                    overlap = len * len;
                }
                
                ll a = -2LL * intervals[i + 1].first;
                ll b = dp[i + 1] + 
                       1LL * intervals[i + 1].first * intervals[i + 1].first - 
                       overlap + lambda;
                cht.add({a, b, cnt[i + 1] + 1});
            }
        }
        
        return {dp[n], cnt[n]};
    };
    
    ll lo = 0, hi = 2LL * m * m;
    ll ans = 1e18;
    
    while (lo <= hi) {
        ll lambda = lo + (hi - lo) / 2;
        auto [cost, photos] = solve(lambda);
        
        ll actual_cost = cost - lambda * k;
        ans = min(ans, actual_cost);
        
        if (photos <= k) {
            hi = lambda - 1;
        } else {
            lo = lambda + 1;
        }
    }
    
    return ans;
}
Compilation message (stderr)
aliens.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
aliens_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |