Submission #754583

#TimeUsernameProblemLanguageResultExecution timeMemory
754583boris_mihov송신탑 (IOI22_towers)C++17
4 / 100
4075 ms10640 KiB
#include <algorithm> #include <iostream> #include <numeric> #include <cassert> #include <vector> #include <stack> typedef long long llong; const int MAXLOG = 20 + 5; const int MAXN = 100000 + 10; const int INF = 1e9; int n; struct Sparse { int sparse[MAXLOG][MAXN]; int lg[MAXN]; void build(int _vals[]) { for (int i = 1 ; i <= n ; ++i) { sparse[0][i] = _vals[i]; } for (int log = 1 ; (1 << log) <= n ; ++log) { for (int i = 1 ; i + (1 << log) - 1 <= n ; ++i) { sparse[log][i] = std::max(sparse[log - 1][i], sparse[log - 1][i + (1 << log - 1)]); } } for (int i = 1 ; i <= n ; ++i) { lg[i] = lg[i - 1]; if ((1 << lg[i] + 1) < i) { lg[i]++; } } } int findMAX(int l, int r) { int log = lg[r - l + 1]; return std::max(sparse[log][l], sparse[log][r - (1 << log) + 1]); } }; int a[MAXN]; int b[MAXN]; int c[MAXN]; int d[MAXN]; int h[MAXN]; Sparse sparse; std::stack <int> st; std::vector <int> v; int isClimb; void init(int N, std::vector <int> H) { n = N; for (int i = 1 ; i <= n ; ++i) { h[i] = H[i - 1]; } sparse.build(h); st.push(0); for (int i = 1 ; i <= n ; ++i) { while (h[st.top()] > h[i]) { st.pop(); } a[i] = st.top(); st.push(i); } for (int i = 1 ; i <= n ; ++i) { if ((i == 1 || a[i - 1] < a[i]) && (i == n || a[i] < a[i + 1])) { isClimb = i; break; } } for (int i = 1 ; i < isClimb ; ++i) { if (a[i] > a[i + 1]) { isClimb = -1; break; } } if (isClimb != -1) { for (int i = isClimb ; i < n ; ++i) { if (a[i] < a[i + 1]) { isClimb = -1; break; } } } while (!st.empty()) { st.pop(); } st.push(n + 1); for (int i = n ; i >= 1 ; --i) { while (h[st.top()] > h[i]) { st.pop(); } c[i] = st.top(); st.push(i); } for (int i = 1 ; i <= n ; ++i) { if (a[i] == i - 1) { b[i] = 0; } else { b[i] = sparse.findMAX(a[i] + 1, i - 1) - h[i]; } if (c[i] == i + 1) { d[i] = 0; } else { d[i] = sparse.findMAX(i + 1, c[i] - 1) - h[i]; } } v.push_back(d[1]); v.push_back(b[n]); for (int i = 2 ; i < n ; ++i) { v.push_back(std::min(b[i], d[i])); } std::sort(v.begin(), v.end()); } bool entered; int max_towers(int L, int R, int D) { L++; R++; if (isClimb != -1) { if (isClimb < L || R < isClimb) { return 1; } if (a[L] + D <= a[isClimb] && a[R] + D <= a[isClimb]) { return 2; } return 1; } if (L == R) { return 1; } if (L == 1 && R == n) { int l = -1, r = n, mid; while (l < r - 1) { mid = (l + r) / 2; if (v[mid] < D) l = mid; else r = mid; } return n - r; } int ans = 0; for (int i = L ; i <= R ; ++i) { if ((a[i] < L || b[i] >= D) && (c[i] > R || d[i] >= D)) { ans++; } } return ans; }

Compilation message (stderr)

towers.cpp: In member function 'void Sparse::build(int*)':
towers.cpp:30:93: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   30 |                 sparse[log][i] = std::max(sparse[log - 1][i], sparse[log - 1][i + (1 << log - 1)]);
      |                                                                                         ~~~~^~~
towers.cpp:37:29: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
   37 |             if ((1 << lg[i] + 1) < i)
      |                       ~~~~~~^~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...