Submission #1056150

#TimeUsernameProblemLanguageResultExecution timeMemory
1056150anangoFire (BOI24_fire)C++17
100 / 100
1066 ms270252 KiB
#include <bits/stdc++.h> #define int long long using namespace std; const int K = 20; int INF = 1LL<<60; signed main() { #ifndef ONLINE_JUDGE // for getting input from input.txt //freopen("input.txt", "r", stdin); // for writing output to output.txt //freopen("output.txt", "w", stdout); #endif #ifdef ONLINE_JUDGE ios_base::sync_with_stdio(false); cin.tie(NULL); #endif //fast IO int n,m; cin >> n >> m; vector<pair<int,int>> segments; vector<int> coords; //coords.push_back(0); //0 to m-1 map<int,int> rev; for (int i=0; i<n; i++) { int l,r; cin >> l >> r; if (l<r) { segments.push_back({l,r}); coords.push_back(l); coords.push_back(r); segments.push_back({m+l,m+r}); coords.push_back(m+l); coords.push_back(m+r); } else { segments.push_back({l,m+r}); coords.push_back(l); coords.push_back(m+r); } } int n0 = segments.size(); sort(coords.begin(), coords.end()); coords.erase(unique(coords.begin(), coords.end()),coords.end()); int k = coords.size(); for (int i=0; i<k; i++) { rev[coords[i]] = i; } for (int i=0; i<n0; i++) { segments[i] = {rev[segments[i].first],rev[segments[i].second]}; } vector<int> go(k,-1); multiset<int> ends; set<int> indices; sort(segments.begin(), segments.end()); int pointer = 0; int lpointer = 0; for (int i=0; i<k; i++) { while (pointer<n0 && segments[pointer].first==i) { indices.insert(pointer); ends.insert(segments[pointer].second); pointer++; } if (!ends.size()) { go[i] = -1; } else { go[i] = *ends.rbegin(); } while (lpointer<n0 && segments[lpointer].second==i) { indices.erase(lpointer); ends.erase(ends.find(segments[lpointer].second)); lpointer++; } } for (int i=0; i<k; i++) { //cout << i <<" " << coords[i] <<" " << go[i] << " " << coords[go[i]] << endl; } vector<vector<int>> lift(k,vector<int>(K,-1)); for (int i=0; i<k; i++) { lift[i][0] = go[i]; } for (int p=1; p<K; p++) { for (int i=0; i<k; i++) { lift[i][p] = lift[lift[i][p-1]][p-1]; } } int mians = INF; for (int i=0; i<k; i++) { int cur = i; int ct = 0; for (int p=K-1; p>=0; p--) { if (coords[lift[cur][p]]<coords[i]+m) { cur = lift[cur][p]; ct+=1<<p; } } int p = 0; if (coords[lift[cur][p]]<=coords[i]+m) { cur = lift[cur][p]; ct++; } if (coords[cur]>=coords[i]+m) { mians=min(mians,ct); } } if (mians<INF) cout << mians << endl; else cout << -1 << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...