#include "aliens.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define ALL(x) (x).begin(), (x).end()
#define REP(i, l, r) for (int i = (l); i < (r); ++i)
#define len(x) int(x.size())
ll pow2(ll v) {
return v * v;
}
struct Line {
ll a, b;
ll eval(ll x) {
return a * x + b;
}
};
struct CHT {
// add: decrease
// query: increase
// query: min
deque<Line> deq;
void add(Line line) {
if (not deq.empty() and deq.front().a == line.a) {
if (deq.front().b < line.b) {
return;
} else {
deq.pop_front();
}
}
while (len(deq) >= 2) {
if (__int128_t(deq[0].a - line.a) * __int128_t(deq[1].b - deq[0].b) <= __int128_t(deq[0].b - line.b) * __int128_t(deq[1].a - deq[0].a)) {
deq.pop_front();
} else {
break;
}
}
deq.push_front(line);
}
ll query(ll x) {
while (len(deq) >= 2) {
if (deq[len(deq) - 1].eval(x) >= deq[len(deq) - 2].eval(x)) {
deq.pop_back();
} else {
break;
}
}
return deq.back().eval(x);
ll mn = 1ll << 60;
for (auto &line : deq) mn = min(mn, line.eval(x));
return mn;
}
};
long long take_photos(int n, int m, int K, std::vector<int> r, std::vector<int> c) {
vector<pair<int, int>> pts(n);
REP(i, 0, n) {
if (r[i] > c[i]) {
swap(r[i], c[i]);
}
pts[i] = make_pair(r[i], c[i]);
}
sort(ALL(pts));
{
vector<pair<int, int>> pts2;
REP(i, 0, n) {
if (i != n - 1 and pts[i].first == pts[i + 1].first) {
continue;
}
pts2.push_back(pts[i]);
}
pts = pts2;
n = len(pts);
}
{
vector<pair<int, int>> pts2;
int mx_c = -1;
REP(i, 0, n) {
if (pts[i].second <= mx_c) {
continue;
}
pts2.push_back(pts[i]);
mx_c = max(mx_c, pts[i].second);
}
pts = pts2;
n = len(pts);
}
vector<vector<ll>> dp(n + 1, vector<ll>(K + 1, 1ll << 60));
dp[0][0] = 0;
REP(k, 0, K) {
CHT cht;
REP(i, 0, n + 1) {
if (i != 0) {
ll x = pts[i - 1].second;
ll mn = cht.query(x);
ll res = mn + x * x;
dp[i][k + 1] = res;
}
if (i == n) {
continue;
}
ll a = 2 * (-pts[i].first + 1);
ll diff = pow2(max(0ll, i == 0 ? 0ll : (pts[i - 1].second - pts[i].first + 1)));
ll b = dp[i][k] + pow2(-pts[i].first + 1) - diff;
cht.add({a, b});
}
}
/*
REP(i, 1, n + 1) {
REP(j, 0, i) {
ll x = pts[i - 1].second;
ll diff = pow2(pts[i - 1].second - pts[j].first + 1);
ll cost = diff - pow2(max(0ll, (j == 0 ? 0ll : (ll(pts[j - 1].second - pts[j].first + 1)))));
REP(k, 0, K) {
dp[i][k + 1] = min(dp[i][k + 1], dp[j][k] + cost);
}
}
}
*/
ll ans = 1ll << 60;
REP(i, 0, K + 1) {
ans = min(ans, dp[n][i]);
}
return ans;
}
컴파일 시 표준 에러 (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... |