Sparse Table (์คํ์ค ํ ์ด๋ธ) ํน์ง
- ๋ฐฉํฅ ๊ทธ๋ํ ์ ๋๋ค.
- ๋ชจ๋ ์ ์ด ๋ชฉ์ ์ง๊ฐ ์์ต๋๋ค.
- ๊ทธ ์ ์ ํ๊ณ ์๋ก์ด ์ ์ผ๋ก ๊ฐ๋๋ค.
- 2์ ์ ๊ณฑ๊ทผ์ผ๋ก ๋์ฐฉํ ์ ์ ์ ์ฅํฉ๋๋ค.
(1๋ฒ, 2๋ฒ, 4๋ฒ, 8๋ฒ ์ด๋์ ๋ํ ๋ฐฐ์ด์ ๋ชจ๋ ์ ์ฅํฉ๋๋ค.)
์์ ๋ฅผ ํ๋ฉด์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
https://www.acmicpc.net/problem/17435
์ด ๋ฌธ์ ๋ ํจ์ f(x)๊ฐ ์์ ๋ f3(x)๋ < y= f(x) ----> z = f(y) ----> w = f(z) ----> result = w > ํจ์f(x)์ ๊ฒฐ๊ณผ๊ฐ์ ๋ค์ ํจ์f(x)์ ๋ฃ๋๊ฑธ n๋ฒ ๋ฐ๋ณตํ๋ ๋ฌธ์ ์ ๋๋ค.
์ด ์ฒ๋ผ f(x)๋ y๋ผ๋ ๋ฐฉํฅ์ฑ์ ๊ฐ์ง ๊ทธ๋ํ๋ก ํํ์ด ๊ฐ๋ฅํฉ๋๋ค.
์๋ ๊ทธ๋ฆผ์ 1๋ฒ์จฐ๋ <2์ 0์น> 2๋ฒ์งธ๋ <2์ 1์น> 3๋ฒ์งธ๋ <2์ 0์น ํ 2์ 1์น>์ ํ ๊ฒฐ๊ณผ ์ ๋๋ค.
์ด๋ฅผ ํ ์ด๋ธ๋ก ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
Table[x][y] | [1] | [2] | [3] | [4] | [5] |
[0] | 3 | 3 | 5 | 4 | 3 |
[1]= 2์ 0์น | 5 | 5 | 3 | 4 | 5 |
[2]= 2์ 1์น | 3 | 3 | 5 | 4 | 3 |
[3]= 2์ 0์น + 2์ 1์น | 5 | 5 | 3 | 4 | 5 |
Q. ์ 2์ ์ ๊ณฑ๊ทผ์ผ๊น?
2์ ์ ๊ณฑ๊ทผ์ ๋ชจ๋ ์๋ฅผ ํํ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 |
1000 | 1001 | 1002 | 1,003 | 1004 | |||||
0011 1110 1000 | 0011 1110 1001 | 0011 1110 1010 | 0011 1110 1011 | 0011 1110 1100 |
๋ฌธ์ ์์ n์ด 1 ≤ n ≤ 500,000 ์ฌ์ด์ ์ ์ด๋ฏ๋ก, ์๋์ ๊ฐ์ ๋ฒ์๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ x๋ 0 ~ 18์ฌ์ด์ ๊ฐ์ด ๋ ๊ฒ๋๋ค.
์ ํฌ๋ SparseTable[0][x]์ ์ด๊ธฐ๊ฐ์ ๋ฃ์์ผ๋ฏ๋ก SparseTable[19][x] ๊น์ง ์ฌ์ฉํ๋ฉด ๋๊ฒ ์ฃ ?
#include <iostream>
#include <vector>
using namespace std;
int SparseTable[20][200'001];
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int m;
cin >> m;
vector<int> vec;
for (int i = 1; i <= m; ++i)
{
int fm;
cin >> fm;
SparseTable[0][i] = (fm);
}
for (int i = 1; i < 20; ++i)
{
for (int j = 1; j <= m; ++j)
{
int temp = SparseTable[i - 1][j];
SparseTable[i][j] = SparseTable[i - 1][temp];
}
}
int q;
cin >> q;
while (q--)
{
int n, x;
cin >> n >> x;
int idx = x;
for (int k = 0; k < 20; k++)
{
if (n & (1 << k)) {
idx = SparseTable[k][idx];
}
}
cout << idx << "\n";
}
return 0;
}
๋.
ps. ์์ฆ ์งคํฐ - ์ง์น์น๊ตฌ๋ค์ด ๋๋ฌด ์ฌ๋ฏธ์๋ค. ๊น๋๋ฐฐ ๋๋ฌด ๊ท์ฌ์ ~~!!!!
'๐จ๐ปโ๐ป programming > โฝ ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
binary search & lower bound & upper bound [c++ ๊ตฌํ] (0) | 2024.07.05 |
---|---|
[Algorithm/ ๋นํธ๋ง์คํฌ] (4) | 2023.02.17 |
[Algorithm/Shortest Path] A* ์๊ณ ๋ฆฌ์ฆ - ๊ตฌํC++ (0) | 2022.06.20 |
[Algorithm/MST] ํ๋ฆผ(Prim) ์๊ณ ๋ฆฌ์ฆ (0) | 2022.03.07 |
[Algorithm/MST] ํฌ๋ฃจ์ค์นผ(Kruscal) ์๊ณ ๋ฆฌ์ฆ (0) | 2022.03.03 |
์ ํ๋ ๊ฒ ๋ณด๋ค ๋ซ๊ฒ ์ง
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!