Skip to content

Commit 5a7f63d

Browse files
authored
Merge pull request #455 from xirc/min-max-queue
MinMaxQueue
2 parents 2942136 + 2502832 commit 5a7f63d

File tree

8 files changed

+170
-126
lines changed

8 files changed

+170
-126
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ This project contains my competitive programming library, examples, and solution
6262

6363
* [Disjoint Set Union](/lib/cpalgo/ds/README.md#Disjoint-Set-Union)
6464
* [Binary Indexed Tree](/lib/cpalgo/ds/README.md#Binary-Indexed-Tree)
65-
* [Minimum Queue](/lib/cpalgo/ds/README.md#Minimum-Queue)
65+
* [MinMax Queue](/lib/cpalgo/ds/README.md#MinMax-Queue)
6666
* [MinMax Stack](/lib/cpalgo/ds/README.md#MinMax-Stack)
6767
* [Randomized Heap](/lib/cpalgo/ds/README.md#Randomized-Heap)
6868
* [Segment Tree](/lib/cpalgo/ds/README.md#Segment-Tree)

aoj/DSL/DSL3D/main_minimum-queue.cpp

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -56,58 +56,71 @@ class MinMaxStack {
5656
};
5757

5858
template <class T, class Less = std::less<T>>
59-
class MinimumQueue {
59+
class MinMaxQueue {
6060
private:
61-
MinMaxStack<T, Less> Sp, Sr;
61+
MinMaxStack<T, Less> in_stack, out_stack;
6262
Less less;
6363

6464
public:
6565
// Time: O(1)
6666
bool empty() const {
67-
return Sp.empty() && Sr.empty();
67+
return in_stack.empty() && out_stack.empty();
6868
}
6969
// Time: O(1)
7070
size_t size() const {
71-
return Sp.size() + Sr.size();
71+
return in_stack.size() + out_stack.size();
7272
}
7373
// Time: O(1)
7474
void push(T const& value) {
75-
Sp.push(value);
75+
in_stack.push(value);
7676
}
7777
// Time: O(N), amortized O(1)
7878
void pop() {
79-
if (Sr.empty()) {
80-
while (!Sp.empty()) {
81-
auto value = Sp.top();
82-
Sp.pop();
83-
Sr.push(value);
79+
if (out_stack.empty()) {
80+
while (!in_stack.empty()) {
81+
auto value = in_stack.top();
82+
in_stack.pop();
83+
out_stack.push(value);
8484
}
8585
}
86-
Sr.pop();
86+
out_stack.pop();
8787
}
8888
// Time: O(1)
8989
T front() const {
90-
if (Sr.empty()) {
91-
return Sp.bottom();
90+
if (out_stack.empty()) {
91+
return in_stack.bottom();
9292
}
93-
return Sr.top();
93+
return out_stack.top();
9494
}
9595
// Time: O(1)
9696
T back() const {
97-
if (!Sp.empty()) {
98-
return Sp.top();
97+
if (!in_stack.empty()) {
98+
return in_stack.top();
9999
}
100-
return Sr.bottom();
100+
return out_stack.bottom();
101101
}
102102
// Time: O(1)
103103
T minimum() const {
104-
if (Sp.empty() || Sr.empty()) {
105-
return Sp.empty() ? Sr.minimum() : Sp.minimum();
104+
if (in_stack.empty()) {
105+
return out_stack.minimum();
106+
} else if (out_stack.empty()) {
107+
return in_stack.minimum();
106108
} else {
107-
auto m1 = Sp.minimum(), m2 = Sr.minimum();
109+
auto m1 = in_stack.minimum(), m2 = out_stack.minimum();
108110
return less(m1, m2) ? m1 : m2;
109111
}
110112
}
113+
// Time: O(1)
114+
T maximum() const {
115+
if (in_stack.empty()) {
116+
return out_stack.maximum();
117+
} else if (out_stack.empty()) {
118+
return in_stack.maximum();
119+
} else {
120+
auto m1 = in_stack.maximum(), m2 = out_stack.maximum();
121+
return less(m1, m2) ? m2 : m1;
122+
}
123+
}
111124
};
112125

113126
using namespace std;
@@ -123,7 +136,7 @@ int main() {
123136
cin >> array[i];
124137
}
125138

126-
MinimumQueue<int> Q;
139+
MinMaxQueue<int> Q;
127140
for (int i = 0; i < L; ++i) {
128141
Q.push(array[i]);
129142
}

lib/cpalgo/ds/README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ Binary Indexed Tree (Fenwick Tree) is a data structure.
2323
### References in Japanese
2424
- [Binary Indexed Tree のはなし](http://hos.ac/slides/20140319_bit.pdf)
2525

26-
## Minimum Queue
27-
🚧WIP
26+
## MinMax Queue
27+
A data structure that allows to store and retrieve elements in a first-in-first-out (FIFO) fashion.
28+
This data structure also allows to retrieval of the minimum and maximum value efficiently.
2829

2930
## MinMax Stack
3031
A data structure that allows to store and retrieve elements in a last-in-first-out (LIFO) fashion.

lib/cpalgo/ds/minimum_queue.hpp

Lines changed: 0 additions & 69 deletions
This file was deleted.

lib/cpalgo/ds/minmax_queue.hpp

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#pragma once
2+
3+
#include <algorithm>
4+
#include <functional>
5+
#include <stack>
6+
#include "minmax_stack.hpp"
7+
8+
9+
// MinMaxQueue
10+
//
11+
// Space: O(N)
12+
//
13+
// Verified
14+
// - https://onlinejudge.u-aizu.ac.jp/problems/DSL_3_D
15+
//
16+
template <class T, class Less = std::less<T>>
17+
class MinMaxQueue {
18+
private:
19+
MinMaxStack<T, Less> in_stack, out_stack;
20+
Less less;
21+
22+
public:
23+
// Time: O(1)
24+
bool empty() const {
25+
return in_stack.empty() && out_stack.empty();
26+
}
27+
// Time: O(1)
28+
size_t size() const {
29+
return in_stack.size() + out_stack.size();
30+
}
31+
// Time: O(1)
32+
void push(T const& value) {
33+
in_stack.push(value);
34+
}
35+
// Time: O(N), amortized O(1)
36+
void pop() {
37+
if (out_stack.empty()) {
38+
while (!in_stack.empty()) {
39+
auto value = in_stack.top();
40+
in_stack.pop();
41+
out_stack.push(value);
42+
}
43+
}
44+
out_stack.pop();
45+
}
46+
// Time: O(1)
47+
T front() const {
48+
if (out_stack.empty()) {
49+
return in_stack.bottom();
50+
}
51+
return out_stack.top();
52+
}
53+
// Time: O(1)
54+
T back() const {
55+
if (!in_stack.empty()) {
56+
return in_stack.top();
57+
}
58+
return out_stack.bottom();
59+
}
60+
// Time: O(1)
61+
T minimum() const {
62+
if (in_stack.empty()) {
63+
return out_stack.minimum();
64+
} else if (out_stack.empty()) {
65+
return in_stack.minimum();
66+
} else {
67+
auto m1 = in_stack.minimum(), m2 = out_stack.minimum();
68+
return less(m1, m2) ? m1 : m2;
69+
}
70+
}
71+
// Time: O(1)
72+
T maximum() const {
73+
if (in_stack.empty()) {
74+
return out_stack.maximum();
75+
} else if (out_stack.empty()) {
76+
return in_stack.maximum();
77+
} else {
78+
auto m1 = in_stack.maximum(), m2 = out_stack.maximum();
79+
return less(m1, m2) ? m2 : m1;
80+
}
81+
}
82+
};

0 commit comments

Comments
 (0)