Submission #1289959

#TimeUsernameProblemLanguageResultExecution timeMemory
1289959yasiAliens (IOI16_aliens)C++20
60 / 100
2107 ms354992 KiB
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

const long long INF = 1e18;

struct Interval
{
    int l, r;
    bool operator<(const Interval &other) const
    {
        return l < other.l || (l == other.l && r > other.r);
    }
};

vector<Interval> clearedIntervals(vector<Interval> &intervals)
{
    sort(intervals.begin(), intervals.end());
    vector<Interval> cleared;
    cleared.push_back({-1, -1});
    for (int i = 0; i < intervals.size(); i++)
    {
        if (cleared.back().r < intervals[i].r)
            cleared.push_back(intervals[i]);
    }

    return cleared;
}

long long sqr(long long x)
{
    return x * x;
}

void rec(vector<vector<long long>> &dp, vector<Interval> &intervals, int k, int l, int r, int optl, int optr)
{
    if (l > r)
        return;
    int mid = (l + r) / 2;
    int opt;

    dp[mid][k] = INF;
    for (int t = optl; t <= optr; t++)
    {
        long long curr = dp[t - 1][k - 1] + sqr(intervals[mid].r - intervals[t].l + 1) -
                         sqr(max(0, intervals[t - 1].r - intervals[t].l + 1));
        if (curr < dp[mid][k])
        {
            dp[mid][k] = curr;
            opt = t;
        }
    }

    rec(dp, intervals, k, l, mid - 1, optl, opt);
    rec(dp, intervals, k, mid + 1, r, opt, optr);
}

long long take_photos(int n, int m, int k, std::vector<int> r, std::vector<int> c)
{
    vector<Interval> initialIntervals;
    for (int i = 0; i < n; i++)
    {
        initialIntervals.push_back({min(r[i], c[i]), max(r[i], c[i])});
    }

    vector<Interval> intervals = clearedIntervals(initialIntervals);
    n = intervals.size() - 1;
    vector<vector<long long>> dp(n + 1, vector<long long>(k + 1, 0));

    for (int i = 1; i <= n; i++)
        dp[i][0] = INF;

    for (int j = 1; j <= k; j++)
        rec(dp, intervals, j, 1, n, 1, n);

    long long ans = INF;
    for (int j = 0; j <= k; j++)
        ans = min(ans, dp[n][j]);
    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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...