이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
using ull = unsigned long long;
template <class T>
void read(T &x)
{
x = 0;
register int c;
while ((c = getchar()) && (c > '9' || c < '0'))
;
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
}
constexpr bool typetest = 0;
constexpr int N = 1e5 + 5;
constexpr ll Inf = 1e17;
int m, n, k;
pair<int, int> a[N];
ll cnt[N], sum[N];
int opt[N];
struct ConvexHullTrick
{
vector<ll> A, B;
vector<int> line;
vector<ld> point;
ConvexHullTrick(int n = 0)
{
A.resize(n + 2, 0);
B.resize(n + 2, 0);
point.emplace_back(-Inf);
}
ld ff(int x, int y)
{
return (ld)1.0 * (B[y] - B[x]) / (A[x] - A[y]);
}
void Add(int i)
{
while ((int)line.size() > 2 || ((int)line.size() == 1 && A[line.back()] == A[i]))
{
if (A[line.back()] == A[i])
{
if (B[line.back()] > B[i])
{
line.pop_back();
if (!line.empty())
point.pop_back();
}
else
break;
}
else
{
if (ff(i, line.back()) <= ff(i, line[line.size() - 2]))
{
line.pop_back();
if (!line.empty())
point.pop_back();
}
else
break;
}
}
if (line.empty() || A[line.back()] != A[i])
{
if (!line.empty())
point.emplace_back(ff(line.back(), i));
line.emplace_back(i);
}
}
ll More(int x)
{
return cnt[x - 1] * a[x].second + sum[x - 1];
}
pair<ll, int> Get(int x)
{
int j = lower_bound(point.begin(), point.end(), a[x].second) - point.begin();
return {A[line[j - 1]] * a[x].second + B[line[j - 1]] + More(x), opt[line[j - 1]] + 1};
}
};
pair<ll, ll> Cal(ll cost)
{
ConvexHullTrick f(n);
opt[0] = f.A[0] = 0;
f.B[0] = cost;
f.Add(0);
for (int i = 1; i <= n; ++i)
{
pair<ll, int> v = f.Get(i);
opt[i] = v.second;
f.A[i] = -cnt[i];
f.B[i] = v.first - sum[i] + cost;
f.Add(i);
if (i == n)
return {v.second, v.first - v.second * cost};
}
return {0, 0};
}
long long take_photos(int N, int M, int K, vector<int> r, vector<int> c)
{
/* Convert */
m = M;
n = N;
k = K;
for (int i = 1; i <= n; ++i)
{
a[i] = make_pair(r[i - 1] + 1, c[i - 1] + 1);
if (a[i].first > a[i].second)
swap(a[i].first, a[i].second);
}
sort(a + 1, a + n + 1, [&](const pair<int, int> &x, const pair<int, int> &y)
{ return x.second < y.second || (x.second == y.second && x.first > y.first); });
vector<int> s;
for (int i = 1; i <= n; ++i)
{
while (!s.empty() && a[i].first <= a[s.back()].first)
s.pop_back();
s.emplace_back(i);
}
n = s.size();
k = min(k, n);
for (int i = 1; i <= n; ++i)
a[i] = a[s[i - 1]];
/* End Convert */
long long temp(0);
for (int i = 1, j = 1, now = 0; i <= m; ++i)
{
if (j <= n && a[j].first == i)
{
now = a[j].second;
++j;
}
if (now >= i)
temp += 2 * (now - i + 1) - 1;
}
for (int i = 1; i <= n; ++i)
{
if (i == n)
{
cnt[i] = (a[i].second - a[i].first + 1) * 2;
sum[i] = -cnt[i] * a[i].second;
}
else if (a[i].second < a[i + 1].first)
{
cnt[i] = (a[i].second - a[i].first + 1) * 2;
sum[i] = -cnt[i] * a[i].second;
sum[i] += -1ll * (a[i + 1].first - a[i].second - 1) * (a[i + 1].first + a[i].second) + (a[i + 1].first - a[i].second - 1);
cnt[i] += 2 * (a[i + 1].first - a[i].second - 1);
}
else
{
cnt[i] = (a[i + 1].first - a[i].first) * 2;
sum[i] = -cnt[i] * a[i].second;
}
cnt[i] += cnt[i - 1];
sum[i] += sum[i - 1];
}
ll ans(Inf);
ll l = 1, mid, h = m * m;
while (l <= h)
{
mid = (l + h) / 2;
if (Cal(mid).first >= k)
l = mid + 1;
else
h = mid - 1;
}
// cout << h << '\n';
pair<ll, ll> u = Cal(h);
if (h == m * m)
return u.second + temp;
pair<ll, ll> v = Cal(l);
if (v.first == u.first)
return u.second + temp;
ll a1 = k - u.first - k + v.first,
b1 = (k - u.first) * (-v.second) + (k - v.first) * u.second;
ans = -b1 / a1;
return ans + temp;
}
void Read()
{
int m, n, k;
cin >> n >> m >> k;
vector<int> x(n), y(n);
for (int i = 0; i < n; ++i)
cin >> x[i] >> y[i];
cout << take_photos(n, m, k, x, y);
}
void Solve()
{
}
/*
int32_t main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
if (fopen("tests.INP", "r"))
{
freopen("test.inp", "r", stdin);
freopen("test.out", "w", stdout);
}
int t(1);
if (typetest)
cin >> t;
for (int _ = 1; _ <= t; ++_)
{
// cout << "Case #" << _ << ":\n";
Read();
Solve();
}
// cerr << "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << "ms\n";
}
/*
*/
컴파일 시 표준 에러 (stderr) 메시지
aliens.cpp:258:1: warning: "/*" within comment [-Wcomment]
258 | /*
|
aliens.cpp: In function 'void read(T&)':
aliens.cpp:12:18: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
12 | register int c;
| ^
# | 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... |