Submission #1294949

#TimeUsernameProblemLanguageResultExecution timeMemory
1294949Ice_manEvent Hopping 2 (JOI21_event2)C++20
100 / 100
106 ms24204 KiB
/** ____ ____ ____ __________________ ____ ____ ____ ||I || ||c || ||e || || || ||M || ||a || ||n || ||__|| ||__|| ||__|| ||________________|| ||__|| ||__|| ||__|| |/__\| |/__\| |/__\| |/________________\| |/__\| |/__\| |/__\| */ #include <bits/stdc++.h> #define maxn (int)(4e5 + 5) #define maxlog (int)(20) #define PB push_back #define X first #define Y second typedef long long ll; typedef std::pair <int, int> pii; typedef std::pair <ll, ll> pll; typedef std::pair <int, ll> pil; typedef std::pair <ll, int> pli; const ll mod = 1e9 + 7; const ll INF = 1e9; int pre[maxn], n , k; struct sparse_table { int table[maxlog][maxn]; void build() { for(int i = 1; i <= 2 * n + 1; i++) table[0][i] = pre[i]; for(int power = 1; (1LL << power) <= 2 * n + 1; power++) for(int i = 1; i <= 2 * n; i++) if(table[power - 1][i] > 0 && table[power - 1][i] <= 2 * n + 1) table[power][i] = table[power - 1][table[power - 1][i]]; else table[power][i] = 0; } int get(int l, int r) { if(l == 0) l = 1; if(r == 2 * n + 1) r = 2 * n; if(l > r) return 0; int pp = l, ret = 0; for(int power = maxlog - 1; power >= 0; power--) if(table[power][pp] != 0 && table[power][pp] <= r) { ret += (1 << power); pp = table[power][pp]; } return ret; } }; sparse_table tt; void read_solve() { std::cin >> n >> k; std::vector <int> l(n + 1) , r(n + 1); std::vector <std::pair <int , pii> > sorted; for(int i = 1; i <= n; i++) { std::cin >> l[i] >> r[i]; sorted.PB({l[i] , {i , -1}}); sorted.PB({r[i] , {i , 1}}); } std::sort(sorted.begin() , sorted.end()); int comp = 0; for(int i = 0; i < sorted.size(); i++) { if(i == 0 || sorted[i].X > sorted[i - 1].X) comp++; if(sorted[i].Y.Y == -1) l[sorted[i].Y.X] = comp; else r[sorted[i].Y.X] = comp; } for(int i = 0; i <= 2 * n + 1; i++) pre[i] = 2 * n + 1; for(int i = 1; i <= n; i++) pre[l[i]] = std::min(pre[l[i]] , r[i]); for(int i = 2 * n - 1; i >= 1; i--) pre[i] = std::min(pre[i] , pre[i + 1]); pre[0] = 1; tt.build(); if(tt.get(1 , 2 * n) < k) { std::cout << -1 << "\n"; return; } std::set <pii> seg; seg.insert({0 , 0}); seg.insert({2 * n + 1 , 2 * n + 1}); std::vector <int> ans; int br = tt.get(1 , 2 * n); for(int i = 1; i <= n; i++) { if(ans.size() == k) break; auto it = seg.lower_bound({l[i] , 0}); if(it -> X != it -> Y && it -> X < r[i]) continue; auto pom = std::prev(it); if(pom -> X != pom -> Y && pom -> Y > l[i]) continue; int smetka = tt.get(pom -> Y , l[i]) + tt.get(r[i] , it -> X) - tt.get(pom -> Y , it -> X); if(br + smetka + 1 >= k) { br += smetka + 1; ans.PB(i); seg.insert({l[i] , r[i]}); } } //std::cout << "!!! " << ans.size() << "\n"; for(auto& e : ans) std::cout << e << "\n"; } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); int tests = 1; //std::cin >> tests; while(tests--) { read_solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...