이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define vint vector<int>
using namespace std;
#ifndef x
// #include ".h"
#else
#endif
int n;
vint l, r;
ll I(int i) {
if(r[i] < l[i + 1]) return 0;
return powl(r[i] - l[i + 1] + 1, 2);
}
ll P(array<ll, 3> p, ll x) {
return p[0] * x + p[1];
}
bool CW(array<ll, 3> a, array<ll, 3> b, array<ll, 3> c) {
a[0] = b[0] - a[0];
a[1] = b[1] - a[1];
b[0] = c[0] - b[0];
b[1] = c[1] - b[1];
return (a[0] * b[1] - b[0] * a[1] >= 0);
}
array<ll, 2> dpsol(ll am) {
vector<array<ll, 2> > dp(n);
dp[0] = {(ll)powl(r[0] - l[0] + 1, 2) + am, 1};
deque<array<ll, 3> > d;
int dg = 0;
for(int i = 0; i < n; ++i) {
if(i > 0) {
ll x = -r[i];
ll c = powl(r[i] + 1, 2) + am;
while(dg < sz(d) - 1 && P(d[dg + 1], x) < P(d[dg], x)) dg += 1;
dp[i][0] = P(d[dg], x) + c;
dp[i][1] = d[dg][2] + 1;
ll y = powl(r[i] - l[0] + 1, 2) + am;
if(dp[i][0] > y) {
dp[i][0] = y;
dp[i][1] = 1;
}
}
if(i < n - 1) {
ll a = 2ll * l[i + 1];
ll b = dp[i][0] + I(i) - 2ll * l[i + 1];
b += powl(l[i + 1], 2);
array<ll, 3> x = {a, b, dp[i][1]};
while(sz(d) >= 2 && CW(d[sz(d) - 2], d[sz(d) - 1], x)) {
d.pop_back();
if(dg == sz(d)) dg -= 1;
}
d.push_back(x);
}
}
array<ll, 2> x = dp[n - 1];
x[0] -= x[1] * am;
return x;
}
ll take_photos(int N, int m, int k, vint R, vint C) {
n = N;
vector<int> lg(m, -1);
for(int i = 0; i < n; ++i) {
array<int, 2> x = {R[i], C[i]};
if(x[0] > x[1]) swap(x[0], x[1]);
lg[x[1]] = max(lg[x[1]], x[0]);
}
vector<array<int, 2> > v;
for(int i = 0; i < m; ++i) {
if(lg[i] == -1) continue;
while(sz(v) && lg[i] <= v.back()[0]) {
v.pop_back();
}
v.push_back({lg[i], i});
}
n = sz(v);
l = r = vint(n);
for(int i = 0; i < n; ++i) {
l[i] = v[i][0];
r[i] = v[i][1];
}
ll al = 0, ar = 1e9;
while(al < ar) {
ll am = al + ar >> 1;
if(dpsol(am)[1] > k) al = am + 1;
else ar = am;
}
array<ll, 2> x = dpsol(al);
// cout << x[1] << " " << al << endl;
return x[0];
}
#ifdef x
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout << take_photos(5, 7, 1, {0, 4, 4, 4, 4}, {3, 4, 6, 5, 6}) << endl;
cout << take_photos(5, 7, 2, {0, 4, 4, 4, 4}, {3, 4, 6, 5, 6}) << endl;
cout << take_photos(2, 6, 2, {1, 4}, {4, 1}) << endl;
return 0;
}
#endif
컴파일 시 표준 에러 (stderr) 메시지
aliens.cpp: In function 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:92:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
92 | ll am = al + ar >> 1;
| ~~~^~~~
# | 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... |