Submission #554573

#TimeUsernameProblemLanguageResultExecution timeMemory
554573MilosMilutinovicEvent Hopping 2 (JOI21_event2)C++14
100 / 100
271 ms29640 KiB
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n, k; cin >> n >> k; vector<int> l(n), r(n); for (int i = 0; i < n; i++) { cin >> l[i] >> r[i]; --r[i]; } vector<int> xs; for (int i = 0; i < n; i++) { xs.push_back(l[i]); xs.push_back(r[i]); } sort(xs.begin(), xs.end()); xs.erase(unique(xs.begin(), xs.end()), xs.end()); for (int i = 0; i < n; i++) { l[i] = lower_bound(xs.begin(), xs.end(), l[i]) - xs.begin(); r[i] = lower_bound(xs.begin(), xs.end(), r[i]) - xs.begin(); } int sz = xs.size(); const int LOG = 20; vector<vector<int>> nxt(sz, vector<int>(LOG, 1e9)); for (int i = 0; i < n; i++) { nxt[l[i]][0] = min(nxt[l[i]][0], r[i]); } for (int i = sz - 1; i > 0; i--) { nxt[i - 1][0] = min(nxt[i - 1][0], nxt[i][0]); } for (int j = 1; j < LOG; j++) { for (int i = 0; i < sz; i++) { if (nxt[i][j - 1] + 1 < sz) { nxt[i][j] = nxt[nxt[i][j - 1] + 1][j - 1]; } } } map<int, int> mp; mp[0] = sz - 1; int cc; auto Count = [&](int L, int R) { int cnt = 0; for (int j = LOG - 1; j >= 0; j--) { if (L < sz && nxt[L][j] <= R) { cnt += (1 << j); L = nxt[L][j] + 1; } } return cnt; }; cc = Count(0, sz - 1); function<void(int, int)> Cut = [&](int L, int R) { auto it = prev(mp.lower_bound(L + 1)); cc -= Count(it->first, it->second); int xl = it->first; int xr = it->second; mp.erase(it); if (xl != L) { cc += Count(xl, L - 1); mp[xl] = L - 1; } if (xr != R) { cc += Count(R + 1, xr); mp[R + 1] = xr; } }; function<void(int, int)> Update = [&](int L, int R) { { auto it = mp.lower_bound(L); if (it != mp.begin() && prev(it)->second == L - 1) { cc -= Count(prev(it)->first, prev(it)->second); L = prev(it)->first; mp.erase(prev(it)); } } { auto it = mp.lower_bound(R + 1); if (it != mp.end() && it->first == R + 1) { cc -= Count(it->first, it->second); R = it->second; mp.erase(it); } } mp[L] = R; cc += Count(L, R); }; auto Check = [&](int L, int R) { auto it = mp.lower_bound(L + 1); if (it == mp.begin()) { return false; } it = prev(it); return it->first <= L && R <= it->second; }; vector<int> ans; for (int i = 0; i < n; i++) { if (!Check(l[i], r[i])) { continue; } Cut(l[i], r[i]); if (cc >= k - ans.size() - 1) { ans.push_back(i); } else { Update(l[i], r[i]); } auto it = mp.begin(); while (it != mp.end()) { it = next(it); } } if (ans.size() < k) { cout << -1 << '\n'; } else { for (int i = 0; i < k; i++) { cout << ans[i] + 1 << '\n'; } } return 0; }

Compilation message (stderr)

event2.cpp: In function 'int main()':
event2.cpp:105:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |     if (cc >= k - ans.size() - 1) {
      |         ~~~^~~~~~~~~~~~~~~~~~~~~
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) {
      |       ~~~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...