[C++] ํฌ์†Œ ํ…Œ์ด๋ธ”(Sparse Table)

2021. 11. 17. 21:18ยท๐Ÿ“ Computer Science/โœ Algorithm

ํฌ์†Œ ํ…Œ์ด๋ธ”(Sparse Table)

  • ๋ฐฐ์—ด์ด ์ •์ ์ด์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ๋ฐฐ์—ด ๋‚ด์šฉ์ด ์ˆ˜์ •๋˜๋ฉด ์•ˆ ๋œ๋‹ค.
  • ๋ฐฐ์—ด์˜ ์•„์ด๋””์–ด๋Š” ๋ถ„ํ•  ์ •๋ณต๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ๋” ๋น ๋ฅด๋‹ค.

 

๊ธฐ๋ณธ ์›๋ฆฌ

๋ชจ๋“  ์ •์ ์˜ ๊ฐ„์„ ์ด 1๊ฐœ์ธ ์œ ํ–ฅ ๊ทธ๋ž˜ํ”„๊ฐ€ ์กด์žฌํ•  ๋•Œ ์–ด๋–ค ์ •์ ์—์„œ ์‹œ์ž‘ํ•ด k๋ฒˆ ์ด๋™์„ ํ•˜๋ฉด ๋„์ฐฉํ•˜๋Š” ์ ์€ ์œ ์ผํ•˜๋‹ค. ์ด๋•Œ k๋ฒˆ์„ ์ผ์ผ์ด ๋งค๋ฒˆ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๋„์ฐฉ์ ์„ ๊ณ„์‚ฐํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ k๊ฐ’์ด ์ปค์งˆ์ˆ˜๋ก ์‹œ๊ฐ„๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ด๋‹ค.

 

๋งŒ์•ฝ ์–ด๋–ค ์ •์ ์˜ n๋ฒˆ ์ด๋™ํ–ˆ์„ ๋•Œ ๋„์ฐฉ์ , ๋˜ ๊ทธ ๋„์ฐฉ์ ์„ ์ •์ ๋งˆ๋‹ค ๋‹ค ๊ธฐ์–ตํ•˜๋Š” ๋ฐฐ์—ด์ด ์žˆ๋‹ค๋ฉด ๋„์ฐฉ์ ์„ ๋งค์šฐ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฐฐ์—ด์€ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ์•ผ ํ• ๊นŒ?

 

1์นธ, 2์นธ, 4์นธ, 8์นธ, 16์นธ,... ๋“ฑ 2์ง„์ˆ˜๋ฅผ ์ด์šฉํ•ด 2์ง„์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ์ด๋™ ๊ฐ’์„ ๋ชจ๋‘ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋™ ํšŸ์ˆ˜ k๋ฅผ 2์ง„์ˆ˜๋กœ ๋‚˜ํƒ€๋ƒˆ์„ ๋•Œ ์ผœ์ ธ ์žˆ๋Š” ๋น„ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐฐ์—ด๋งŒ ์‚ฌ์šฉํ•ด ๊ฑด๋„ˆ๋›ฐ๋ฉด ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋›ฐ๋Š” ์ˆœ์„œ๋Š” ์ƒ๊ด€์ด ์—†๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, k๊ฐ€ 13(1101(2))์ด๋ผ๋ฉด ์ผœ์ ธ ์žˆ๋Š” ๋น„ํŠธ์— ํ•ด๋‹นํ•˜๋Š” 1์นธ, 4์นธ, 8์นธ ์ด 3๋ฒˆ๋งŒ ๋›ฐ๋ฉด ๋œ๋‹ค.

 

๋ฌธ์ œ

 

https://www.acmicpc.net/problem/17435

 

17435๋ฒˆ: ํ•ฉ์„ฑํ•จ์ˆ˜์™€ ์ฟผ๋ฆฌ

ํ•จ์ˆ˜ f : {1, 2, ..., m}→{1, 2, ..., m}์ด ์žˆ๋‹ค. ์ด๋•Œ fn : {1, 2, ..., m}→{1, 2, ..., m}์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•˜์ž. f1(x) = f(x) fn+1(x) = f(fn(x)) ์˜ˆ๋ฅผ ๋“ค์–ด f4(1) = f(f(f(f(1))))์ด๋‹ค. n๊ณผ x๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ fn(x)๋ฅผ ๊ณ„์‚ฐํ•˜๋Š”

www.acmicpc.net

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    cin.tie(NULL);
    cout.tie(NULL);
    ios_base::sync_with_stdio(false);

    int m;
    cin >> m;

    int f[200001][20]; // f[i][j]: ์ •์  i์—์„œ 2^j๋ฒˆ ์ด๋™ํ•œ ํ›„์˜ ์ •์ 
    for (int i = 1; i <= m; ++i)
        cin >> f[i][0];

    // 2์ง„์ˆ˜ ์ด๋™ ๊ฐ’์„ ๋ฐฐ์—ด์— ์ฑ„์šด๋‹ค.
    for (int j = 1; j < 20; j++)
        for (int i = 1; i <= m; i++)
            f[i][j] = f[f[i][j - 1]][j - 1];

    int q;
    cin >> q;
    while (q--) {
        int n, x;
        cin >> n >> x;

        for (int i = 0; 0 < n; i++) {
            // ์ผœ์ ธ์žˆ๋Š” ๋น„ํŠธ๋งŒ ์ด๋™ํ•œ๋‹ค.
            if (n & 1)
                x = f[x][i];
            n >>= 1;
        }

        cout << x << '\n';
    }
}

 

https://www.acmicpc.net/problem/14942

 

14942๋ฒˆ: ๊ฐœ๋ฏธ

์ž์—ฐ์ˆ˜ n์ด ์ฃผ์–ด์ง„๋‹ค. n์€ ๋ฐฉ์˜ ๊ฐœ์ˆ˜์ด๋‹ค. (1 ≤ n ≤ 105) ๋‹ค์Œ n๊ฐœ์˜ ์ค„์—๋Š” ์ฐจ๋ก€๋Œ€๋กœ ํ˜„์žฌ ๊ฐ๊ฐ์˜ ๊ฐœ๋ฏธ๊ฐ€ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ์—๋„ˆ์ง€ ๊ฐ’์ด ์ฃผ์–ด์ง„๋‹ค. i+1๋ฒˆ์งธ ์ค„์—๋Š” i๋ฒˆ์งธ ๋ฐฉ์— ์žˆ๋Š” ๊ฐœ๋ฏธ๊ฐ€ ๊ฐ€์ง„ ์—๋„ˆ

www.acmicpc.net

#include <iostream>
#include <vector>
using namespace std;

int n;
vector<int> energys;
vector<pair<int, int>> tunnels[100001];

int parent[100001][20]; // ์ •์  i์—์„œ 2^j๋ฒˆ ์ด๋™ํ•œ ํ›„์˜ ์ •์ 
int dist[100001][20]; // ์ •์  i์—์„œ parent[i][j]๋กœ ์ด๋™ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์—๋„ˆ์ง€

void dfs(int start, int index) 
{
    parent[start][0] = index;
    for (pair<int, int> next : tunnels[start])
        if (next.first != index) {
            dist[next.first][0] = next.second;
            dfs(next.first, start);
        }
}

int main()
{
    cin.tie(NULL);
    cout.tie(NULL);
    ios_base::sync_with_stdio(false);

    cin >> n;
    energys.resize(n);
    for (int i = 0; i < n; ++i)
        cin >> energys[i];
    for (int i = 0; i < n - 1; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        tunnels[a].push_back({ b, c });
        tunnels[b].push_back({ a, c });
    }

    // ๊ฐœ๋ฏธ๊ตด์„ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค์–ด ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
    dfs(1, 0);

    // 2์ง„์ˆ˜ ์ด๋™ ๊ฐ’์„ ๋ฐฐ์—ด์— ์ฑ„์šด๋‹ค.
    for (int i = 1; i < 20; i++)
        for (int j = 1; j <= n; j++) {
            dist[j][i] = dist[j][i - 1] + dist[parent[j][i - 1]][i - 1];
            parent[j][i] = parent[parent[j][i - 1]][i - 1];
        }

    for (int i = 0; i < n; i++) {
        int pos = i + 1, energy = energys[i];
        for (int j = 20 - 1; j >= 0; j--) {
            if (parent[pos][j] != 0 && energy >= dist[pos][j]) {
                energy -= dist[pos][j];
                pos = parent[pos][j];
            }
        }
        cout << pos << '\n';
    }
}
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Computer Science/โœ Algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [C++] ๋ฌธ์ž์—ด
  • [C++] ๋„คํŠธ์›Œํฌ ์œ ๋Ÿ‰(Network Flow)
  • [C++] ์œ„์ƒ ์ •๋ ฌ(Topological Sort)
  • [C++] ํŽœ์œ… ํŠธ๋ฆฌ(Fenwick Tree)
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[C++] ํฌ์†Œ ํ…Œ์ด๋ธ”(Sparse Table)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”