Submission #1034821

#TimeUsernameProblemLanguageResultExecution timeMemory
1034821RecursiveCoFire (BOI24_fire)C++17
100 / 100
419 ms117036 KiB
// CF template, version 3.0 #include <bits/stdc++.h> using namespace std; #define improvePerformance ios_base::sync_with_stdio(false); cin.tie(0) #define getTest int t; cin >> t #define eachTest for (int _var=0;_var<t;_var++) #define get(name) int (name); cin >> (name) #define out(o) cout << (o) #define getList(cnt, name) vector<int> (name); for (int _=0;_<(cnt);_++) { get(a); (name).push_back(a); } #define sortl(name) sort((name).begin(), (name).end()) #define rev(name) reverse((name).begin(), (name).end()) #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++) #define decision(b) if (b){out("YES");}else{out("NO");} #define int long long int template <typename T, typename I> struct segtree { int n; vector<T> tree; vector<I> initial; T id; segtree(int i_n, vector<I> i_initial, T i_id): n(i_n), initial(i_initial), id(i_id) { tree.resize(4 * n); } T conquer(T left, T right) { // write your conquer function } T value(I inp) { // write your value function } void build(int v, int l, int r) { if (l == r) tree[v] = value(initial[l]); else { int middle = (l + r) / 2; build(2 * v, l, middle); build(2 * v + 1, middle + 1, r); tree[v] = conquer(tree[2 * v], tree[2 * v + 1]); } } void upd(int v, int l, int r, int i, I x) { if (l == r) tree[v] = value(x); else { int middle = (l + r) / 2; if (middle >= i) upd(2 * v, l, middle, i, x); else upd(2 * v + 1, middle + 1, r, i, x); tree[v] = conquer(tree[2 * v], tree[2 * v + 1]); } } T query(int v, int l, int r, int ql, int qr) { if (ql <= l && r <= qr) return tree[v]; else if (r < ql || qr < l) return id; int middle = (l + r) / 2; T left = query(2 * v, l, middle, ql, qr); T right = query(2 * v + 1, middle + 1, r, ql, qr); return conquer(left, right); } }; // vector<int> vector<vector<int>> lift; vector<int> go; int calc(int l, int r) { int d = l; bool extra = go[r] == r; int ret = 0; int i = 19; int p = 524288; while (i >= 0) { int dest = lift[d][i]; if (dest <= r - extra) { d = dest; ret += p; } i--; p /= 2; } if (d < r) d = go[d], ret++; /*out(l); out(" "); out(r); out(" "); out(d); out(endl);*/ if (d >= r) return ret; return 1e18; } signed main() { improvePerformance; //getTest; //eachTest { get(n); get(m); vector<pair<int, int>> ranges; vector<pair<int, int>> wraps; vector<int> vals; int r = 0; int w = 0; forto(n, i) { get(s); get(e); vals.push_back(s); vals.push_back(e); if (s < e) ranges.push_back({s, e}), r++; else wraps.push_back({e, s}), w++; } vals.push_back(0); vals.push_back(m - 1); map<int, int> coords; sortl(vals); int ind = 0; int s = vals.size(); forto(s, i) { if (i == 0 || vals[i] != vals[i - 1]) coords[vals[i]] = ind++; } int N = ind; forto(r, i) { ranges[i].first = coords[ranges[i].first]; ranges[i].second = coords[ranges[i].second]; } forto(w, i) { wraps[i].first = coords[wraps[i].first]; wraps[i].second = coords[wraps[i].second]; } int maxwrap = 0; forto(w, i) maxwrap = max(maxwrap, wraps[i].first); int minwrap = N; forto(w, i) minwrap = min(minwrap, wraps[i].second); sortl(ranges); go.resize(N); int maxi = 0; int ptr = 0; forto(N, i) { while (ptr < r && ranges[ptr].first <= i) maxi = max(maxi, ranges[ptr++].second); maxi = max(maxi, i); go[i] = maxi; } lift.resize(N, vector<int>(20)); for (int i = N - 1; i >= 0; i--) { lift[i][0] = go[i]; forto(20, j) { if (j == 0) continue; lift[i][j] = lift[lift[i][j - 1]][j - 1]; } } int ans = 1e18; int onlyrng = 0; ind = 0; while (ind < N && go[ind] != ind) onlyrng++, ind = go[ind]; if (go[ind] != ind) ans = min(ans, onlyrng); sortl(wraps); rev(wraps); int indone = N; ptr = 0; for (int i = maxwrap; i >= 0; i--) { int two = calc(i, minwrap) + 2; while (ptr < w && wraps[ptr].first >= i) indone = min(indone, wraps[ptr++].second); int one = calc(i, indone) + 1; ans = min({ans, one, two}); } if (ans == 1e18) out(-1); else out(ans); //} }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:10:23: warning: unnecessary parentheses in declaration of 'n' [-Wparentheses]
   10 | #define get(name) int (name); cin >> (name)
      |                       ^
Main.cpp:106:9: note: in expansion of macro 'get'
  106 |         get(n);
      |         ^~~
Main.cpp:10:23: warning: unnecessary parentheses in declaration of 'm' [-Wparentheses]
   10 | #define get(name) int (name); cin >> (name)
      |                       ^
Main.cpp:107:9: note: in expansion of macro 'get'
  107 |         get(m);
      |         ^~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
Main.cpp:113:9: note: in expansion of macro 'forto'
  113 |         forto(n, i) {
      |         ^~~~~
Main.cpp:10:23: warning: unnecessary parentheses in declaration of 's' [-Wparentheses]
   10 | #define get(name) int (name); cin >> (name)
      |                       ^
Main.cpp:114:13: note: in expansion of macro 'get'
  114 |             get(s);
      |             ^~~
Main.cpp:10:23: warning: unnecessary parentheses in declaration of 'e' [-Wparentheses]
   10 | #define get(name) int (name); cin >> (name)
      |                       ^
Main.cpp:115:13: note: in expansion of macro 'get'
  115 |             get(e);
      |             ^~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
Main.cpp:127:9: note: in expansion of macro 'forto'
  127 |         forto(s, i) {
      |         ^~~~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
Main.cpp:131:9: note: in expansion of macro 'forto'
  131 |         forto(r, i) {
      |         ^~~~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
Main.cpp:135:9: note: in expansion of macro 'forto'
  135 |         forto(w, i) {
      |         ^~~~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
Main.cpp:140:9: note: in expansion of macro 'forto'
  140 |         forto(w, i) maxwrap = max(maxwrap, wraps[i].first);
      |         ^~~~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
Main.cpp:142:9: note: in expansion of macro 'forto'
  142 |         forto(w, i) minwrap = min(minwrap, wraps[i].second);
      |         ^~~~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
Main.cpp:147:9: note: in expansion of macro 'forto'
  147 |         forto(N, i) {
      |         ^~~~~
Main.cpp:15:35: warning: unnecessary parentheses in declaration of 'j' [-Wparentheses]
   15 | #define forto(name, var) for (int (var) = 0; (var) < (name); (var)++)
      |                                   ^
Main.cpp:155:13: note: in expansion of macro 'forto'
  155 |             forto(20, j) {
      |             ^~~~~
#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...