Skip to content

Commit ddee6c9

Browse files
committed
fix
1 parent b13b49c commit ddee6c9

File tree

2 files changed

+23
-36
lines changed

2 files changed

+23
-36
lines changed

tests/library_checker_aizu_tests/data_structures/rmq_linear.test.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,25 @@ int main() {
77
cin >> n >> q;
88
vector<int> a(n);
99
for (int i = 0; i < n; i++) cin >> a[i];
10-
linear_rmq lin_rmq(a, less());
10+
linear_rmq rmq_less(a, less());
11+
linear_rmq rmq_less_equal(a, less_equal());
12+
vector<int> neg_a(n);
13+
for (int i = 0; i < n; i++) neg_a[i] = -a[i];
14+
linear_rmq rmq_greater(neg_a, greater());
15+
linear_rmq rmq_greater_equal(neg_a, greater_equal());
1116
while (q--) {
1217
int l, r;
1318
cin >> l >> r;
14-
int idx_min = lin_rmq.query_idx(l, r - 1);
15-
assert(l <= idx_min && idx_min < r);
16-
assert(lin_rmq.query(l, r - 1) == a[idx_min]);
17-
cout << a[idx_min] << '\n';
19+
int idx_right_min = rmq_less.query_idx(l, r - 1);
20+
assert(idx_right_min + 1 == r || rmq_less.query(idx_right_min + 1, r - 1) > a[idx_right_min]);
21+
assert(l <= idx_right_min && idx_right_min < r);
22+
assert(rmq_less.query(l, r - 1) == a[idx_right_min]);
23+
assert(idx_right_min == rmq_greater.query_idx(l, r - 1));
24+
int idx_left_min = rmq_less_equal.query_idx(l, r - 1);
25+
assert(l <= idx_left_min && idx_left_min < r);
26+
assert(idx_left_min == rmq_greater_equal.query_idx(l, r - 1));
27+
assert(a[idx_right_min] == a[idx_left_min]);
28+
assert(idx_left_min <= idx_right_min);
29+
cout << a[idx_right_min] << '\n';
1830
}
1931
}

tests/library_checker_aizu_tests/mono_st_asserts.hpp

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include "../../library/data_structures/uncommon/linear_rmq.hpp"
77
tuple<int, vector<vector<int>>, vector<int>>
88
min_cartesian_tree(const vector<int>& a,
9-
const vector<int>& l, const vector<int>& r) {
9+
const vector<int>& l, const vector<int>& r) {
1010
int n = sz(a);
1111
assert(sz(l) == n && sz(r) == n);
1212
auto is_node = [&](int i) -> bool {
@@ -24,7 +24,7 @@ min_cartesian_tree(const vector<int>& a,
2424
root = i;
2525
} else if (is_node(i)) {
2626
bool le_par =
27-
(l[i] >= 0 && (r[i] == n || a[l[i]] > a[r[i]]));
27+
(l[i] >= 0 && (r[i] == n || a[l[i]] > a[r[i]]));
2828
adj[to_min[le_par ? l[i] : r[i]]].push_back(i);
2929
}
3030
}
@@ -40,42 +40,17 @@ void mono_st_asserts(const vector<int>& a) {
4040
for (auto cmp : compares) {
4141
vector<int> init(n);
4242
iota(begin(init), end(init), 0);
43-
RMQ rmq(init, [&](int x, int y) -> int {
44-
return cmp(a[x], a[y]) ? x : y;
45-
});
4643
linear_rmq lin_rmq(a, cmp);
4744
auto l = mono_st(a, cmp), r = mono_range(l),
4845
p = cart_binary_tree(l);
49-
{
50-
int iterations = 0;
51-
queue<array<int, 3>> q;
52-
q.push({0, n, -1}); // node_le, node_ri, parent
53-
while (!empty(q)) {
54-
auto [node_le, node_ri, node_par] = q.front();
55-
q.pop();
56-
if (node_le == node_ri) continue;
57-
iterations++;
58-
int idx_root = rmq.query(node_le, node_ri);
59-
int idx_root_2 =
60-
lin_rmq.query_idx(node_le, node_ri - 1);
61-
assert(idx_root == idx_root_2);
62-
assert(node_le <= idx_root && idx_root < node_ri);
63-
assert(l[idx_root] == node_le - 1);
64-
assert(r[idx_root] == node_ri);
65-
assert(p[idx_root] == node_par);
66-
q.push({node_le, idx_root, idx_root});
67-
q.push({idx_root + 1, node_ri, idx_root});
68-
}
69-
assert(iterations == n);
70-
}
7146
{
7247
vector old_way_ri =
73-
mono_st<int>({rbegin(a), rend(a)},
74-
[&](int x, int y) { return !cmp(y, x); });
48+
mono_st<int>({rbegin(a), rend(a)},
49+
[&](int x, int y) { return !cmp(y, x); });
7550
reverse(begin(old_way_ri), end(old_way_ri));
7651
transform(begin(old_way_ri), end(old_way_ri),
77-
begin(old_way_ri),
78-
[&](int i) { return sz(a) - i - 1; });
52+
begin(old_way_ri),
53+
[&](int i) { return sz(a) - i - 1; });
7954
assert(r == old_way_ri);
8055
}
8156
int iterations = 0;

0 commit comments

Comments
 (0)