# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
415034 |
2021-05-31T13:02:22 Z |
최서현(#7466) |
Event Hopping 2 (JOI21_event2) |
C++17 |
|
82 ms |
11704 KB |
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <tuple>
#include <queue>
#include <set>
#define pii pair<int, int>
#define piii pair<int, pii>
#define pll pair<long long, long long>
#define plll pair<long long, pll>
#define tiii tuple<int, int, int>
#define tiiii tuple<int, int, int, int>
#define ff first
#define ss second
#define ee ss.ff
#define rr ss.ss
#define DEBUG
using namespace std;
const int INF = (int)1e9 + 7;
pii X[101010];
int sp[101010][20];
int qry(int l, int r)
{
if(l == r) return 0;
int ret = 1;
for(int i = 19; i >= 0; --i) if(sp[l][i] < r) l = sp[l][i], ret += (1 << i);
return ret;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n, k; cin >> n >> k;
int N = n + 2; k += 2;
pii A[n]; for(auto &i : A) cin >> i.ff >> i.ss;
piii B[N]; for(int i = 0; i < n; ++i) B[i] = {A[i].ss, {A[i].ff, i}};
B[n] = {-INF, {-INF, n}}, B[n + 1] = {INF, {INF, n}};
sort(B, B + N);
int C[n]; for(int i = 0; i < N; ++i) if(B[i].rr < n) C[B[i].rr] = i;
for(int i = 0; i < N; ++i) X[i] = {B[i].ee, B[i].ff};
queue<pii> Q;
for(int i = 0; i < N; ++i)
{
while(Q.size() && Q.front().ff <= X[i].ff) sp[Q.front().ss][0] = i, Q.pop();
Q.push({X[i].ss, i});
}
while(Q.size()) sp[Q.front().ss][0] = INF, Q.pop();
for(int i = 1; i < 20; ++i) for(int j = 0; j < N; ++j)
sp[j][i] = (sp[j][i - 1] == INF ? INF : sp[sp[j][i - 1]][i - 1]);
int ans = qry(0, N);
if(ans < k) { cout << -1; return 0; }
set<pii> S;
S.insert({0, N});
int cnt = k - 2;
for(int i = 0; i < n; ++i)
{
if(cnt == 0) return 0;
int l = upper_bound(B, B + N, piii{X[C[i]].ff, pii{INF, INF}}) - B;
int r = sp[C[i]][0];
auto it = S.upper_bound({l, INF});
// if(it != S.end()) cout << i << ' ' << it->ff << ' ' << it->ss << endl;
if(it == S.begin() || prev(it)->ff > l || prev(it)->ss < r) continue;
--it;
int s = it->ff, e = it->ss;
int _ans = ans;
_ans -= qry(s, e);
_ans += qry(s, l);
_ans += qry(r, e);
++_ans;
if(_ans < k) continue;
cout << i + 1 << '\n';
ans = _ans;
S.erase(it);
if(s < l) S.insert({s, l});
if(r < e) S.insert({r, e});
--cnt;
}
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
2 |
Correct |
1 ms |
204 KB |
Output is correct |
3 |
Correct |
1 ms |
204 KB |
Output is correct |
4 |
Incorrect |
82 ms |
11704 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
2 |
Correct |
1 ms |
204 KB |
Output is correct |
3 |
Correct |
1 ms |
204 KB |
Output is correct |
4 |
Incorrect |
1 ms |
204 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
2 |
Correct |
1 ms |
204 KB |
Output is correct |
3 |
Correct |
1 ms |
204 KB |
Output is correct |
4 |
Incorrect |
1 ms |
204 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
2 |
Correct |
1 ms |
204 KB |
Output is correct |
3 |
Correct |
1 ms |
204 KB |
Output is correct |
4 |
Incorrect |
82 ms |
11704 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |