이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif
using T = array<long long, 3>;
bool smaller(const T &a, const T &b) {
long long A = a[0] * b[1], B = a[1] * b[0];
return A == B ? a[2] < b[2] : A < B;
}
struct cmp {
bool operator()(const T &a, const T &b) const {
return smaller(a, b);
}
};
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr);
int n, m; cin >> n >> m;
array<vector<int>, 2> a;
a[0].resize(n); a[1].resize(m);
auto nxt = a;
array<vector<bool>, 2> del;
array<priority_queue<T, vector<T>, cmp>, 2> pq;
for (auto it : {0, 1}) {
del[it].resize(a[it].size());
iota(nxt[it].begin(), nxt[it].end(), 1);
for (int &x : a[it]) {
cin >> x;
}
for (int i = 0; i + 1 < a[it].size(); ++i) {
pq[it].push({a[it][i + 1] - a[it][i], 1, i});
}
}
long long res = 0;
auto pop = [&](int it, vector<int> &nxt) {
auto [_, cnt, l] = pq[it].top(); pq[it].pop();
int r = nxt[l];
if (r + 1 == a[it].size()) {
while (cnt--) {
a[it].pop_back();
res += a[it ^ 1].back();
}
} else {
int k = nxt[r];
del[it][r] = 1;
nxt[l] = k;
pq[it].push({a[it][k] - a[it][l], k - l, l});
}
};
auto upd = [&](priority_queue<T, vector<T>, cmp> &pq, vector<bool> &del) {
while (pq.size() && del[pq.top()[2]]) {
pq.pop();
}
};
while (pq[0].size() || pq[1].size()) {
if (!pq[0].size()) {
pop(1, nxt[1]);
} else if (!pq[1].size()) {
pop(0, nxt[0]);
} else if (smaller(pq[0].top(), pq[1].top())) {
pop(1, nxt[1]);
} else {
pop(0, nxt[0]);
}
upd(pq[0], del[0]);
upd(pq[1], del[1]);
}
cout << res;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
kyoto.cpp: In function 'int main()':
kyoto.cpp:39:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
39 | for (int i = 0; i + 1 < a[it].size(); ++i) {
| ~~~~~~^~~~~~~~~~~~~~
kyoto.cpp: In lambda function:
kyoto.cpp:47:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
47 | if (r + 1 == a[it].size()) {
| ~~~~~~^~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |