제출 #1140035

#제출 시각아이디문제언어결과실행 시간메모리
1140035Sir_Ahmed_ImranFire (BOI24_fire)C++20
0 / 100
0 ms328 KiB
// 01001100 01001111 01010100 01000001 \\ // \\ // ╦ ╔═╗╔╦╗╔═╗ \\ // ║ ║ ║ ║ ╠═╣ \\ // ╩═╝╚═╝ ╩ ╩ ╩ \\ // \\ // 01001100 01001111 01010100 01000001 \\ #include <bits/stdc++.h> using namespace std; #define N 400001 #define M 19 #define nl '\n' #define ff first #define ss second #define add insert #define ll long long #define ld long double #define terminator main #define pll pair<ll,ll> #define append push_back #define pii pair<int,int> #define all(x) (x).begin(),(x).end() #define L0TA ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL) int n, m; int mx[N][M]; vector<pii> v, x, y; int get(int i, int j){ int ans = 0; i++, j++; while(i){ ans = max(ans, mx[i][j]); i -= i & - i; } return ans; } void update(int i, int j, int k){ i ++, j++; while(i <= m){ if(j) mx[i][j] = max(mx[i][j], mx[i][j - 1]); mx[i][j] = max(mx[i][j], k); i += i & - i; } } int steps(int l, int r){ int o, ans; ans = 0; for(int i = M - 1; i >= 0; i--){ o = get(l, i); if(o >= r) continue; l = o, ans += 1 << i; } if(get(l, 0) < r) ans = 1e9; return ans + 1; } void compress(){ vector<int> u {0}; unordered_map<int, int> c; for (auto & [i, j] : v){ u.append(i); u.append(j); } sort(all(u)); int cnt = 1; c[0] = 0; for (int i = 1; i < u.size(); i++){ if(u[i] == u[i - 1]) continue; c[u[i]] = cnt; cnt++; } m = cnt; for (auto & [i, j] : v) i = c[i], j = c[j]; } bool possible(){ int r = 0; for(auto & [i, j] : x){ if(i > r) break; r = max(r, j); } return r == m; } void solve(){ int p, q; cin >> n >> m; for (int i = 0; i < n; i++){ cin >> p >> q; v.append({p, q}); } compress(); for (auto & [i, j] : v){ if(i > j){ x.append({0, j}); x.append({i, m}); y.append({i, j}); } else x.append({i, j}); } sort(all(x)); if(!possible()){ cout << "-1"; return; } reverse(all(x)); for (auto & [i, j] : x){ update(i, 0, j); for(int k = 0; k < M-1; k++) update(i, k + 1, get(get(i, k), k)); } int ans = steps(0, m); for(auto & [r, l] : y) ans = min(ans, steps(l, r) + 1); cout << ans; } int terminator(){ L0TA; 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...