ใ๋ชฉ์ฐจใ
0. ๊ฐ์
1. ๋ฌธ์
2. ํ์ด
3. ์ฝ๋
0. ๊ฐ์
์๋ฃ๊ตฌ์กฐ, ์ฐ์ ์์ ํ, ๋ฑ ๋ฌธ์ .
1. ๋ฌธ์
https://www.acmicpc.net/problem/11003
[๋ฌธ์ ]
N๊ฐ์ ์ A1, A2, ..., AN๊ณผ L์ด ์ฃผ์ด์ง๋ค.
Di = Ai-L+1 ~ Ai ์ค์ ์ต์๊ฐ์ด๋ผ๊ณ ํ ๋, D์ ์ ์ฅ๋ ์๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์ด๋, i ≤ 0 ์ธ Ai๋ ๋ฌด์ํ๊ณ D๋ฅผ ๊ตฌํด์ผ ํ๋ค.
[์ ๋ ฅ]
์ฒซ์งธ ์ค์ N๊ณผ L์ด ์ฃผ์ด์ง๋ค. (1 ≤ L ≤ N ≤ 5,000,000)
๋์งธ ์ค์๋ N๊ฐ์ ์ Ai๊ฐ ์ฃผ์ด์ง๋ค. (-109 ≤ Ai ≤ 109)
[์ถ๋ ฅ]
์ฒซ์งธ ์ค์ Di๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์์๋๋ก ์ถ๋ ฅํ๋ค.
[์์ ์ ๋ ฅ 1]
12 3
1 5 2 3 6 2 3 7 3 5 2 6
[์์ ์ถ๋ ฅ 1]
1 1 1 2 2 2 2 2 3 3 2 2
2. ํ์ด
์ด ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด์๋
1. Sliding Window ์๊ณ ๋ฆฌ์ฆ.
2. Priority_queue๋ฅผ ์์์ ์์๋๋ก ์ ๋ ฌํ ์ ์๊ฒ ํ๋ ๋ฐฉ๋ฒ.
์ ๋๊ฐ์ง์ ๋ํด ์๊ณ ์์ด์ผ ํ๋ค.
'Di = Ai-L+1 ~ Ai' ๋ผ๋ ๋ง์ ๊ฒฐ๊ตญ, ๊ธธ์ด๊ฐ L์ธ ๋ถ๋ถ ๊ตฌ๊ฐ์์ ์ฐพ์ ์ต์๊ฐ์ ๊ตฌํ๋ผ๋ ๋ง์ธ๋ฐ, ์ด๋ ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค.
[Navieํ ํ์ด] : ์ ๋ด์ฉ์ Naive ํ๊ฒ ํ๊ฒ ๋๋ฉด, $O(NL)$์ ์๊ฐ๋ณต์ก๋๊ฐ ์์๋๋ค. ์ด๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ ์์ธ์ด ๋๋ค.
์ปจํ ์ด๋ ์ฝ์ : $O(1)$
์ต์๊ฐ ์ฐพ๊ธฐ : $O(L)$
์ปจํ ์ด๋ ์ญ์ : $O(1)$
[Priority Queue๋ฅผ ์ด์ฉํ ํ์ด] : $O(NlogL)$
์ปจํ ์ด๋ ์ฝ์ : $O(logL)$
์ต์๊ฐ ์ฐพ๊ธฐ : $O(1)$
์ปจํ ์ด๋ ์ญ์ : $O(logL)$
ํต์ฌ ๋ก์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
cmp๋ฅผ ํตํด val ๊ฐ์ด ๊ฐ์ฅ ์์ ์์๋ฅผ priority_queue์ ์ต์๋จ์ ์์นํ๋๋ก ์ค์ ํ๋ค.
(val ๊ฐ์ด ๋์ผํ๋ค๋ฉด, ๊ฐ์ฅ ๋ฆ๊ฒ ๋ค์ด์จ ์์, ์ฆ idx๊ฐ์ด ๊ฐ์ฅ ์์ ์์๊ฐ ์ต์๋จ์ ์์นํ๋ค.)
์ดํ, ์ต์๊ฐ์ idx๋ฅผ ํ์ธํ๋๋ฐ, ์ต์๊ฐ์ idx๊ฐ sliding window์ ํฌํจ๋์ง ์๋ ๋ฒ์๋ผ๋ฉด (idx - L ๋ณด๋ค ๊ทธ ๊ฐ์ด ์๊ฑฐ๋ ๊ฐ๋ค๋ฉด) priority_queue์์ ์ ๊ฑฐํ๋ค. while๋ฌธ์ ํตํด ํด๋น ๊ณผ์ ์ ์ํํ๋ฉด ๊ฒฐ๊ตญ priority_queue์ ์ต์๋จ์๋ sliding window์ ๋ฒ์์ ํฌํจ๋๋ ์์ ์ค ์ต์๊ฐ์ด ์์นํ๊ฒ ๋๋ค.
3. ์ฝ๋
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
struct cmp { //priority_queue๋ฅผ ์ํ ๋น๊ต ํจ์.
bool operator()(const pair<int, int>& a, const pair<int, int>& b) {
if (a.second != b.second)
return a.second > b.second; //val ๊ธฐ์ค ์ค๋ฆ์ฐจ์ ์ ๋ ฌ.
else
return a.first > b.first; //idx ๊ธฐ์ค ์ค๋ฆ์ฐจ์ ์ ๋ ฌ.
}
};
int main(int argc, char* argv[]) {
/* Faster */
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
/* Init */
priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> pq; //idx, val
/* Input */
int n, l; cin >> n >> l;
for (int idx = 0; idx < n; idx++) {
/* Input */
int val; cin >> val;
/* Logic */
pq.push(make_pair(idx, val));
while (pq.top().first <= idx - l)
pq.pop();
/* Output */
cout << pq.top().second << ' ';
}
/* Return */
return 0;
}
/*
Sliding Window ์๊ณ ๋ฆฌ์ฆ.
Priority Queue ์ด์ฉ.
[naive ํ์ด]
์ปจํ
์ด๋ ์ฝ์
: O(1)
์ต์๊ฐ ์ฐพ๊ธฐ : O(L)
์ปจํ
์ด๋ ์ญ์ : O(1)
[priority_queue ์ด์ฉ ํ์ด]
์ปจํ
์ด๋ ์ฝ์
: O(logL)
์ต์๊ฐ ์ฐพ๊ธฐ : O(1)
์ปจํ
์ด๋ ์ญ์ : O(logL)
*/
'ใโจ๏ธแดsใPS > ๋ฐฑ์ค_์๋ฃ๊ตฌ์กฐ[DS]' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon/๋ฐฑ์ค][5397][C/C++] ํค๋ก๊ฑฐ (0) | 2023.05.05 |
---|---|
[Baekjoon/๋ฐฑ์ค][1966][C/C++] ํ๋ฆฐํฐ ํ (0) | 2023.05.03 |
[Baekjoon/๋ฐฑ์ค][2164][C/C++] ์นด๋2 (0) | 2023.05.03 |
[Baekjoon/๋ฐฑ์ค][18258][C/C++] ํ 2 (0) | 2023.05.03 |
[Baekjoon/๋ฐฑ์ค][10845][C/C++] ํ (0) | 2023.05.03 |