제출 #397078

#제출 시각아이디문제언어결과실행 시간메모리
397078fedoseevtimofeyEvent Hopping 2 (JOI21_event2)C++14
100 / 100
227 ms25568 KiB
#include <iostream> #include <string> #include <vector> #include <queue> #include <deque> #include <stack> #include <set> #include <map> #include <unordered_map> #include <unordered_set> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <random> #include <iomanip> #include <functional> #include <cassert> #include <bitset> #include <chrono> using namespace std; typedef long long ll; int main() { ios_base::sync_with_stdio(false); cin.tie(0); #ifdef LOCAL freopen("input.txt", "r", stdin); #endif int n, k; cin >> n >> k; vector <int> l(n), r(n); vector <int> c; for (int i = 0; i < n; ++i) { cin >> l[i] >> r[i]; c.push_back(l[i]); c.push_back(r[i]); } sort(c.begin(), c.end()); c.resize(unique(c.begin(), c.end()) - c.begin()); for (int i = 0; i < n; ++i) { l[i] = lower_bound(c.begin(), c.end(), l[i]) - c.begin(); r[i] = lower_bound(c.begin(), c.end(), r[i]) - c.begin(); } int m = c.size(); vector <int> nxt(m + 1, m); for (int i = 0; i < n; ++i) { nxt[l[i]] = min(nxt[l[i]], r[i]); } for (int i = m - 1; i >= 0; --i) { nxt[i] = min(nxt[i], nxt[i + 1]); } const int K = 20; vector <vector <int>> go(K, vector <int> (m + 1, m)); go[0] = nxt; for (int j = 1; j < K; ++j) { for (int i = 0; i <= m; ++i) { go[j][i] = go[j - 1][go[j - 1][i]]; } } auto get_cnt = [&] (int L, int R) { int can = 0; for (int i = K - 1; i >= 0; --i) { if (go[i][L] <= R) { can += (1 << i); L = go[i][L]; } } return can; }; if (get_cnt(0, m - 1) < k) { cout << "-1\n"; return 0; } set <pair <int, int>> segs; segs.insert({-1, 0}); segs.insert({m - 1, m}); int cnt = get_cnt(0, m - 1); auto can_add = [&] (int L, int R) { int new_cnt = cnt; auto nx = segs.lower_bound({L, -1}); int nL = nx->first; if (nL < R) return false; auto pr = prev(nx); int pR = pr->second; if (pR > L) return false; new_cnt -= get_cnt(pR, nL); new_cnt += get_cnt(pR, L); new_cnt += get_cnt(R, nL); ++new_cnt; if (new_cnt >= k) { cnt = new_cnt; segs.insert({L, R}); return true; } else { return false; } }; vector <int> ans; for (int i = 0; i < n; ++i) { if (ans.size() < k && can_add(l[i], r[i])) { ans.push_back(i); } } for (auto x : ans) { cout << x + 1 << '\n'; } }

컴파일 시 표준 에러 (stderr) 메시지

event2.cpp: In function 'int main()':
event2.cpp:102:20: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  102 |     if (ans.size() < k && can_add(l[i], r[i])) {
      |         ~~~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...