Submission #370057

#TimeUsernameProblemLanguageResultExecution timeMemory
370057KoDAliens (IOI16_aliens)C++17
4 / 100
1 ms492 KiB
#include <bits/stdc++.h>
#include "aliens.h"

template <class T>
using Vec = std::vector<T>;
using ll = long long;

ll take_photos(int n, int m, int k, Vec<int> r, Vec<int> c) {
    Vec<std::pair<int, int>> star;
    {
        std::map<int, int> map;
        for (int i = 0; i < n; ++i) {
            if (r[i] > c[i]) {
                std::swap(r[i], c[i]);
            }
            auto &val = map[r[i]];
            val = std::max(val, c[i] + 1);
        }
        int last = -1;
        for (const auto [x, y]: map) {
            if (last < y) {
                star.emplace_back(x, y);
                last = y;
            }
        }
    }
    const int size = (int) star.size();
    Vec<Vec<ll>> cost(size, Vec<ll>(size));
    for (int i = 0; i < size; ++i) {
        for (int j = i + 1; j < size; ++j) {
            const auto L = star[j].second - star[i + 1].first;
            const auto l = std::max(star[i].second - star[i + 1].first, 0);
            cost[i][j] = (ll) L * L - (ll) l * l;
        }
    }
    Vec<ll> dp(size);
    for (int i = 0; i < size; ++i) {
        const auto L = star[i].second - star[0].first;
        dp[i] = (ll) L * L;
    }
    for (int step = 0; step < k; ++step) {
        auto next = dp;
        for (int i = 0; i < size; ++i) {
            for (int j = 0; j < i; ++j) {
                next[i] = std::min(next[i], dp[j] + cost[j][i]);
            }
        }
        dp = std::move(next);
    }
    return dp[size - 1];
}
#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...