Submission #1306148

#TimeUsernameProblemLanguageResultExecution timeMemory
1306148Zbyszek99Event Hopping 2 (JOI21_event2)C++20
100 / 100
212 ms26744 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define ll long long #define ld long double #define ull unsigned long long #define ff first #define ss second #define pii pair<int,int> #define pll pair<long long, long long> #define vi vector<int> #define vl vector<long long> #define pb push_back #define rep(i, b) for(int i = 0; i < (b); ++i) #define rep2(i,a,b) for(int i = a; i <= (b); ++i) #define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c) #define count_bits(x) __builtin_popcountll((x)) #define all(x) (x).begin(),(x).end() #define siz(x) (int)(x).size() #define forall(it,x) for(auto& it:(x)) using namespace __gnu_pbds; using namespace std; typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set; //mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());} //ll los(ll a, ll b) {return a + (mt() % (b-a+1));} const int INF = 1e9+50; const ll INF_L = 1e18+40; const ll MOD = 1e9+7; const int tree_siz = 1024*512-1; pii min_[tree_siz+1]; pii get_min(int akt, int p1, int p2, int s1, int s2) { if(p2 < s1 || p1 > s2) return {1e9,1e9}; if(p1 >= s1 && p2 <= s2) return min_[akt]; return min(get_min(akt*2,p1,(p1+p2)/2,s1,s2),get_min(akt*2+1,(p1+p2)/2+1,p2,s1,s2)); } void upd(int v) { min_[v] = min(min_[v*2],min_[v*2+1]); if(v != 1) upd(v/2); } void change(int ind, pii x) { min_[tree_siz/2+1+ind] = min(min_[tree_siz/2+1+ind],x); upd((tree_siz/2+1+ind)/2); } pii seg[100003]; int jump[100003][17]; int n,k; int count_jumps(int ind, int p) { int ans = 0; for(int bit = 16; bit >= 0; bit--) { int ind2 = jump[ind][bit]; if(seg[ind2].ss <= p) { ind = ind2; ans += (1<<bit); } } return ans; } int main() { ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); //random_start(); cin >> n >> k; rep(i,n) cin >> seg[i].ff >> seg[i].ss; map<int,int> m; rep(i,n) { m[seg[i].ff] = 1; m[seg[i].ss] = 1; } int cur = 2; forall(it,m) m[it.ff] = cur++; rep(i,n) { seg[i].ff = m[seg[i].ff]; seg[i].ss = m[seg[i].ss]; } seg[n] = {cur,cur+2}; seg[n+1] = {0,1}; rep(i,tree_siz+1) min_[i] = {1e9,n}; rep(i,n+2) change(seg[i].ff,{seg[i].ss,i}); jump[n][0] = n; rep(i,n+2) if(i != n) jump[i][0] = get_min(1,0,tree_siz/2,seg[i].ss,cur).ss; rep2(bit,1,16) rep(i,n+2) jump[i][bit] = jump[jump[i][bit-1]][bit-1]; ll cur_ans = count_jumps(n+1,cur); if(cur_ans < k) { cout << "-1\n"; return 0; } set<pii> ans = {{0,n+1},{cur,n}}; rep(i,n) { auto ptr = ans.lower_bound({seg[i].ff,-1}); int nxt_seg = (*ptr).ss; int prv_seg = (*--ptr).ss; int new_ans = cur_ans-count_jumps(prv_seg,seg[nxt_seg].ff)+1+count_jumps(prv_seg,seg[i].ff)+count_jumps(i,seg[nxt_seg].ff); if(new_ans >= k && seg[prv_seg].ss <= seg[i].ff && seg[nxt_seg].ff >= seg[i].ss) { cur_ans = new_ans; ans.insert({seg[i].ff,i}); } } vi ans2; forall(it,ans) ans2.pb(it.ss); sort(all(ans2)); rep(i,k) cout << ans2[i]+1 << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...