Submission #893692

#TimeUsernameProblemLanguageResultExecution timeMemory
893692danikoynovEvent Hopping 2 (JOI21_event2)C++14
32 / 100
3007 ms3924 KiB
/** ____ ____ ____ ____ ____ ____ ||l |||e |||i |||n |||a |||d || ||__|||__|||__|||__|||__|||__|| |/__\|/__\|/__\|/__\|/__\|/__\| **/ #include<bits/stdc++.h> #define endl '\n' using namespace std; typedef long long ll; void speed() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } const int maxn = 1e5 + 10; struct interval { int l, r; }; int n, k; interval seg[maxn]; void input() { cin >> n >> k; for (int i = 1; i <= n; i ++) cin >> seg[i].l >> seg[i].r; } bool cmp(interval it1, interval it2) { if (it1.l != it2.l) return it1.l < it2.l; return it1.r > it2.r; } interval rel[maxn]; int m; void get_relevant() { vector < interval > vec; for (int i = 1; i <= n; i ++) vec.push_back(seg[i]); sort(vec.begin(), vec.end(), cmp); int cl = 1e9 + 10; for (int i = n - 1; i >= 0; i --) { if (vec[i].r >= cl) { continue; } rel[++ m] = vec[i]; cl = vec[i].r; } reverse(rel + 1, rel + m + 1); } int len[2][maxn], pt[2][maxn], used[maxn]; void calc_pointers() { int last = 0; for (int i = 1; i <= m; i ++) { if (used[i]) continue; pt[0][i] = 0; if (last != 0) pt[0][i] = pt[0][last]; while(rel[pt[0][i]].r <= rel[i].l) pt[0][i] ++; pt[0][i] --; while(pt[0][i] > 0 && used[pt[0][i]]) pt[0][i] --; len[0][i] = len[0][pt[0][i]] + 1; last = i; } last = m + 1; for (int i = m; i > 0; i --) { if (used[i]) continue; pt[1][i] = m + 1; if (last != m + 1) pt[1][i] = pt[1][last]; while(rel[pt[1][i]].l >= rel[i].r) pt[1][i] --; pt[1][i] ++; while(pt[1][i] <= m && used[pt[1][m]]) pt[1][m] ++; len[1][i] = len[1][pt[1][i]] + 1; last = i; } } bool intersect(interval a, interval b) { if (a.l == b.l) return true; if (a.l > b.l) swap(a, b); if (a.r >= b.r) return true; return a.r > b.l; } void get_intersections(interval cur) { for (int i = 1; i <= m; i ++) if (used[i] == 0 && intersect(rel[i], cur)) used[i] = 2; } int get_longest() { int ans = 0; for (int i = 1; i <= m; i ++) { if (used[i]) continue; ans = max(ans, max(len[0][i], len[1][i])); } return ans; } void reverse_intersections() { for (int i = 1; i <= m; i ++) if (used[i] == 2) used[i] = 0; } void apply_intersections() { for (int i = 1; i <= m; i ++) if (used[i] == 2) used[i] = 1; } void create_sequence() { vector < int > seq; for (int i = 1; i <= n && k > 0; i ++) { bool valid = true; for (int cur : seq) { if (intersect(seg[cur], seg[i])) { valid = false; break; } } if (!valid) continue; get_intersections(seg[i]); calc_pointers(); int longest = get_longest(); /**cout << i << " " << longest << endl; for (int j = 1; j <= m; j ++) cout << len[0][j] << " "; cout << endl;*/ if (longest >= k - 1) { seq.push_back(i); k --; apply_intersections(); } else reverse_intersections(); } if (k != 0) { cout << -1 << endl; return; } for (int cur : seq) cout << cur << endl; } void solve() { input(); get_relevant(); ///calc_pointers(); create_sequence(); } int main() { solve(); return 0; } /** 2 2 1 3 1 2 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...