이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
vector<array<int, 2>> a(n);
vector<int> yy(2 * n);
for (int i = 0; i < n; ++i) {
cin >> a[i][0] >> a[i][1];
a[i][1] -= 1;
yy[i * 2] = a[i][0];
yy[i * 2 + 1] = a[i][1];
}
sort(yy.begin(), yy.end());
yy.resize(unique(yy.begin(), yy.end()) - yy.begin());
const int m = yy.size();
for (auto &[l, r] : a) {
l = lower_bound(yy.begin(), yy.end(), l) - yy.begin();
r = lower_bound(yy.begin(), yy.end(), r) - yy.begin();
}
vector<array<int, 2>> s(n);
vector<int> inv(n);
for (int i = 0; i < n; ++i) {
s[i] = {a[i][1], i};
}
sort(s.begin(), s.end());
for (int i = 0; i < n; ++i) {
inv[s[i][1]] = i;
}
a.push_back({m + 1, m + 1});
s.push_back({m + 1, n});
vector<int> par(n + 1, n), depth(n + 1), jump(n + 1, n), dp(m, n);
for (int i = n - 1; i >= 0; --i) {
par[i] = par[i + 1];
if (i + 1 < n) {
for (int t = s[i][0] + 1; t <= s[i + 1][0]; ++t) {
par[i] = min(par[i], dp[t]);
}
}
dp[a[s[i][1]][0]] = i;
depth[i] = depth[par[i]] + 1;
int p = jump[par[i]], pp = jump[p];
if (depth[pp] - depth[p] == depth[p] - depth[par[i]]) {
jump[i] = pp;
} else {
jump[i] = par[i];
}
}
auto rangeQuery = [&](int l, int r) {
l = max(l, 0);
int ans = depth[l];
while (l < n && s[l][0] < a[s[r][1]][0]) {
if (jump[l] < n && s[jump[l]][0] < a[s[r][1]][0]) {
l = jump[l];
} else {
l = par[l];
}
}
ans -= depth[l];
return ans;
};
int best = rangeQuery(0, n);
if (best < k) {
cout << "-1\n";
return 0;
}
set<int> alive;
for (int i = 0; i < n && alive.size() < k; ++i) {
int p = inv[i];
auto it = alive.lower_bound(p);
int r = it == alive.end() ? n : *it;
int l = it == alive.begin() ? -1 : *prev(it);
if (r != n && s[p][0] >= a[s[r][1]][0] || l != -1 && s[l][0] >= a[i][0]) {
continue;
}
int now = best - rangeQuery(l, r) + rangeQuery(l, p) + rangeQuery(p, r);
if (now < k) {
continue;
}
best = now;
alive.insert(p);
cout << i + 1 << "\n";
}
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
event2.cpp: In function 'int main()':
event2.cpp:92:43: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
92 | for (int i = 0; i < n && alive.size() < k; ++i) {
| ~~~~~~~~~~~~~^~~
event2.cpp:98:20: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
98 | if (r != n && s[p][0] >= a[s[r][1]][0] || l != -1 && s[l][0] >= a[i][0]) {
# | 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... |