fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll long long
  6. #define ull unsigned long long
  7. #define initial first
  8. #define added second
  9. #define sort_all(v) sort(v.begin(), v.end())
  10.  
  11. #define EGRY \
  12.   ios_base::sync_with_stdio(false); \
  13.   cin.tie(NULL);
  14.  
  15. const int MAX = 6400000;
  16. const int MOD = 998244353;
  17. const ll OO = LLONG_MAX;
  18. const double EPS = (double)1e-9;
  19.  
  20. const int N = 6e3 + 10;
  21.  
  22. struct SparseTable
  23. {
  24. int n, log_table[N];
  25. pair<int, int> sparse_table[N][15];
  26.  
  27. void build(const vector<int> &heights)
  28. {
  29. n = heights.size();
  30. for (int i = 0; i < n; ++i)
  31. {
  32. sparse_table[i][0] = {heights[i], i};
  33. }
  34.  
  35. for (int i = 2; i < N; ++i)
  36. {
  37. log_table[i] = log_table[i / 2] + 1;
  38. }
  39.  
  40. for (int size = 1; size <= log_table[n]; ++size)
  41. {
  42. for (int i = 0; i + (1 << size) <= n; ++i)
  43. {
  44. sparse_table[i][size] = min(sparse_table[i][size - 1], sparse_table[i + (1 << (size - 1))][size - 1]);
  45. }
  46. }
  47. }
  48.  
  49. pair<int, int> query(int left, int right)
  50. {
  51. int length = right - left + 1;
  52. int log_value = log_table[length];
  53. return min(sparse_table[left][log_value], sparse_table[right - (1 << log_value) + 1][log_value]);
  54. }
  55. };
  56.  
  57. int min_brush_strokes(SparseTable &st, int left, int right, int base, const vector<int> &heights)
  58. {
  59. if (left > right)
  60. {
  61. return 0;
  62. }
  63.  
  64. auto [min_value, min_index] = st.query(left, right);
  65.  
  66. int left_strokes = min_brush_strokes(st, left, min_index - 1, min_value, heights);
  67.  
  68. int right_strokes = min_brush_strokes(st, min_index + 1, right, min_value, heights);
  69.  
  70. int strokes_from_current_min = left_strokes + right_strokes + (min_value - base);
  71.  
  72. return min(strokes_from_current_min, right - left + 1);
  73. }
  74.  
  75. void solve()
  76. {
  77. int n;
  78. cin >> n;
  79. vector<int> heights(n);
  80. for (int i = 0; i < n; ++i)
  81. {
  82. cin >> heights[i];
  83. }
  84.  
  85. SparseTable st;
  86. st.build(heights);
  87.  
  88. cout << min_brush_strokes(st, 0, n - 1, 0, heights);
  89. }
  90.  
  91. int main()
  92. {
  93. EGRY int t = 1;
  94. cin >> t;
  95. while (t--)
  96. {
  97. solve();
  98. cout << endl;
  99. }
  100. return 0;
  101. }
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
0