| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 1228422 | LucaIlie | Chorus (JOI23_chorus) | C++17 | 0 ms | 0 KiB | 
#include "aliens.h"
#include <vector>
#include <stdio.h>
#include <algorithm>
using namespace std;
struct interval {
    int l, r;
    bool operator < (interval a) {
        if (l == a.l)
            return r > a.r;
        return l < a.l;
    }
};
const int MAX_N = 1e5;
const long long INF = 1e18;
int cnt[MAX_N + 1];
long long dp[MAX_N + 1];
interval v[MAX_N + 1];
long long take_photos(int n, int m, int k, vector<int> R, vector<int> C) {
    vector<interval> rc(n);
    for (int i = 0; i < n; i++) {
        if (R[i] > C[i])
            swap(R[i], C[i]);
        C[i]++;
        rc[i] = {R[i], C[i]};
    }
    sort(rc.begin(), rc.end());
    n = 0;
    int maxR = -1;
    for (interval a: rc) {
        if (a.r > maxR) {
            v[++n] = a;
            maxR = a.r;
        }
    }
    k = min(k, n);
    long long lb = 0, rb = 1e12;
    while (rb - lb > 1) {
        long long coef = (lb + rb) / 2;
        for (int i = 1; i <= n; i++) {
            dp[i] = INF;
            for (int j = 1; j <= i; j++) {
                long long len = (v[i].r - v[j].l);
                long long over = max(0, (v[j - 1].r - v[j].l));
                if (dp[j - 1] + len * len - over * over < dp[i]) {
                    dp[i] = dp[j - 1] + len * len - over * over + coef;
                    cnt[i] = cnt[j - 1] + 1;
                } else if (dp[j - 1] + len * len - over * over == dp[i]) 
                    cnt[i] = min(cnt[i], cnt[j - 1] + 1);
            }
        }
        if (cnt[n] > k)
            lb = coef;
        else
            rb = coef;
    }
    long long coef = rb;
    for (int i = 1; i <= n; i++) {
        dp[i] = INF;
        for (int j = 1; j <= i; j++) {
            long long len = (v[i].r - v[j].l);
            long long over = max(0, (v[j - 1].r - v[j].l));
            if (dp[j - 1] + len * len - over * over < dp[i]) {
                dp[i] = dp[j - 1] + len * len - over * over + coef;
                cnt[i] = cnt[j - 1] + 1;
            } else if (dp[j - 1] + len * len - over * over == dp[i]) 
                cnt[i] = min(cnt[i], cnt[j - 1] + 1);
        }
    }
    return dp[n] - coef * k;
}
