이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
//Challenge: Accepted
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
#ifdef zisk
void debug(){cout << endl;}
template<class T, class ... U> void debug(T a, U ... b){cout << a << " ", debug(b...);}
template<class T> void pary(T l, T r) {
while (l != r) cout << *l << " ", l++;
cout << endl;
}
#else
#define debug(...) 0
#define pary(...) 0
#endif
#define ll long long
#define maxn 100005
#define pii pair<int, int>
#define ff first
#define ss second
#define io ios_base::sync_with_stdio(0);cin.tie(0);
const int inf = 1<<30;
struct seg{
int l, r, id;
seg(){l = r = id = 0;}
seg(int x, int y, int i){l = x, r = y, id = i;}
} a[maxn], b[maxn];
vector<int> val;
int anc[17][maxn];
int jump(int lind, int rig) {
int ret = 0, cur = anc[0][lind];
if (b[cur].r > rig) return 0;
ret = 1;
for (int i = 16;i >= 0;i--) {
if (b[anc[i][cur]].r <= rig) {
ret += 1<<i;
cur = anc[i][cur];
}
}
return ret;
}
int main() {
io
int n, k;
cin >> n >> k;
for (int i = 0;i < n;i++) {
cin >> a[i].l >> a[i].r;
a[i].id = i;
val.push_back(a[i].l), val.push_back(a[i].r);
}
sort(val.begin(), val.end());
val.resize(int(unique(val.begin(), val.end()) - val.begin()));
for (int i = 0;i < n;i++) {
a[i].l = lower_bound(val.begin(), val.end(), a[i].l) - val.begin();
a[i].r = lower_bound(val.begin(), val.end(), a[i].r) - val.begin();
b[i] = a[i];
}
sort(a, a + n, [&] (seg x, seg y){return x.r > y.r;});
priority_queue<pii, vector<pii>, less<pii> > pq;
int best = inf, bind = n;
b[n] = seg(inf, inf, n);
for (int i = 0;i < n;i++) {
while (pq.size() && pq.top().ff >= a[i].r) {
if (b[pq.top().ss].r < best) {
best = b[pq.top().ss].r;
bind = pq.top().ss;
}
pq.pop();
}
anc[0][a[i].id] = bind;
pq.push({a[i].l, a[i].id});
}
anc[0][n] = n;
for (int i = 1;i < 17;i++) {
for (int j = 0;j <= n;j++) anc[i][j] = anc[i-1][anc[i-1][j]];
}
int lid = a[n-1].id;
int ma = jump(lid, inf - 1) + 1;
if (ma < k) {
cout << -1 << endl;
return 0;
}
set<pii> se;
vector<int> ans;
for (int i = 0;i < n;i++) {
pii ins = {b[i].r, i};
auto ind = se.lower_bound(ins);
bool inter = 0;
int lef = 0, rig = 0, orig = 0;
if (ind == se.end()) {
rig = jump(i, inf - 1);
} else if (b[ind->ss].l < b[i].r) {
inter = 1;
} else {
rig = jump(i, b[ind->ss].l);
}
if (ind == se.begin()) {
orig++;
if (b[i].r > a[n-1].r) {
if (a[n-1].r > b[i].l) lef = 0;
else lef = jump(lid, b[i].l) + 1;
}
} else if (b[prev(ind)->ss].r > b[i].l) {
inter = 1;
} else {
lef = jump(prev(ind)->ss, b[i].l);
}
if (inter) continue;
orig = jump(ind == se.begin() ? lid : prev(ind)->ss, ind == se.end() ? inf - 1 : b[ind->ss].l);
if (ma - orig + lef + rig + 1 >= k) {
ans.push_back(i);
se.insert(ins);
ma = ma - orig + lef + rig + 1;
}
if (ans.size() == k) break;
}
for (int i:ans) cout << i+1 << "\n";
}
/*
5 4
1 3
2 5
8 9
6 8
10 15
*/
컴파일 시 표준 에러 (stderr) 메시지
event2.cpp: In function 'int main()':
event2.cpp:115:18: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
115 | if (ans.size() == k) break;
| ~~~~~~~~~~~^~~~
# | 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... |