제출 #537523

#제출 시각아이디문제언어결과실행 시간메모리
537523someoneEvent Hopping 2 (JOI21_event2)C++14
100 / 100
210 ms27844 KiB
#include <bits/stdc++.h> #define int long long using namespace std; struct Inter { int deb, fin, id; bool operator <(const Inter& other) const { if(deb == other.deb) return fin < other.fin; return deb < other.deb; } }; const int N = 1e5 + 42, T = 17, INF = 1e9 + 42; set<Inter> ans; vector<int> toPrint; Inter inter[N], inter2[N]; int n, k, nb = 0, bl[T][N]; int getNb(int a, int b) { int ans = 0; for(int i = T-1; i > -1; i--) if(inter[bl[i][a]].fin <= inter[b].deb) a = bl[i][a], ans += (1 << i); return ans; } void tryInsert(int i) { if(((int)ans.size()) == k) return; auto it = ans.lower_bound(inter[i]); if(inter[i].fin > (*it).deb && (*it).fin > inter[i].deb) return; int aft = (*it).id; it--; if(inter[i].fin > (*it).deb && (*it).fin > inter[i].deb) return; int pre = (*it).id, ch = getNb(pre, i) + getNb(i, aft) + 1 - getNb(pre, aft); if(nb + ch >= k) { nb += ch; toPrint.push_back(i+1); ans.insert(inter[i]); } } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> k; for(int i = 0; i < n; i++) cin >> inter[i].deb >> inter[i].fin; inter[n].deb = (inter[n].fin = -INF) - 1; inter[n+1].deb = (inter[n+1].fin = INF) - 1; n += 2; for(int i = 0; i < n; i++) inter[i].id = i; for(int i = 0; i < n; i++) inter2[i].id = i, inter2[i].deb = inter[i].deb, inter2[i].fin = inter[i].fin; sort(inter, inter + n, [](Inter a, Inter b) { return a.deb > b.deb; }); sort(inter2, inter2 + n, [](Inter a, Inter b) { return a.fin > b.fin; }); int imin = -1; for(int i = 0, j = 0; i < n; i++) { while(j < n && inter[j].deb >= inter2[i].fin) { if(imin == -1 || inter[j].fin < inter[imin].fin) imin = j; j++; } bl[0][inter2[i].id] = inter[imin].id; } bl[0][n-1] = n-1; for(int i = 1; i < T; i++) for(int j = 0; j < n; j++) bl[i][j] = bl[i-1][bl[i-1][j]]; sort(inter, inter + n, [](Inter a, Inter b) { return a.id < b.id; }); n -= 2; k += 2; ans.insert(inter[n]); ans.insert(inter[n+1]); nb = 2 + getNb(n, n+1); for(int i = 0; i < n; i++) tryInsert(i); if(k-2 == (int)toPrint.size()) { for(int i : toPrint) cout << i << '\n'; } else { cout << "-1"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...