[C++] ํ‰ํ–‰ ๋ถ„ํ• , ๋ชจ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜

2022. 4. 21. 17:40ยท๐Ÿ“ Computer Science/โœ Algorithm

ํ‰ํ–‰ ๋ถ„ํ• , ๋ชจ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ‰ํ–‰ ๋ถ„ํ• (SQRT Decomposition)์€ ๋ฐ์ดํ„ฐ๊ฐ€ N๊ฐœ์ด๋ฉด √N๊ฐœ๋งŒํผ ๋‚˜๋ˆ ์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • ๊ฐ ๊ทธ๋ฃน์€ ๋Œ€ํ‘ฏ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋งŒ์•ฝ ์ฃผ์–ด์ง€๋Š” ์ฟผ๋ฆฌ๊ฐ€ ๊ตฌ๊ฐ„์˜ ๋ง์…ˆ์ด๋ผ๋ฉด ๊ทธ๋ฃน์˜ ํ•ฉ์ด ๋Œ€ํ‘ฏ๊ฐ’์ด ๋œ๋‹ค.

 

ํ‰ํ–‰ ๋ถ„ํ• 

 

๋ชจ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์–ด๋–ค ๊ตฌ๊ฐ„ [s, e]์— ์†ํ•˜๋Š” ์›์†Œ๋“ค์„ ์ด์šฉํ•˜์—ฌ ์–ด๋–ค ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

  • ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์–ด ์ฟผ๋ฆฌ์˜ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ์ฟผ๋ฆฌ ์ˆœ์„œ๋ฅผ ์žฌ๋ฐฐ์น˜ํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ๋ฐฐ์—ด์„ k(√N)๊ฐœ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ ์ฃผ๊ณ , ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋‘ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ ๋จผ์ € ์ฒ˜๋ฆฌํ•œ๋‹ค.
    • [s1/k] < [s2/k]
    • [s1/k] = [s2/k] and e1 < e2

 

๋ฌธ์ œ

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

 

13547๋ฒˆ: ์ˆ˜์—ด๊ณผ ์ฟผ๋ฆฌ 5

๊ธธ์ด๊ฐ€ N์ธ ์ˆ˜์—ด A1, A2, ..., AN์ด ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ, ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. i j: Ai, Ai+1, ..., Aj์— ์กด์žฌํ•˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

www.acmicpc.net

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

const int MAX = 100000;
const int MAX_VAL = 1000000;

struct QueryNode {
    int i, j, index;
    int sqrtN;

    QueryNode() : QueryNode(0, 0, -1, 0) {}
    QueryNode(int i, int j, int index, int N) : i(i), j(j), index(index) { sqrtN = sqrt(N); }

    // (s/√N, e) ์ˆœ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    bool operator <(const QueryNode& O)const {
        if (i / sqrtN != O.i / sqrtN)
            return (i / sqrtN < O.i / sqrtN);
        return (j < O.j);
    }
};

int N, M, A[MAX]{};
int result[MAX]{};
QueryNode Q[MAX];

int main()
{
    cin >> N;
    for (int i = 0; i < N; ++i)
        cin >> A[i];
    cin >> M;

    // ์ฟผ๋ฆฌ๋ฅผ ์ž…๋ ฅ๋ฐ›์€ ํ›„ ์ •๋ ฌ
    for (int index = 0, i, j; index < M; ++index) {
        cin >> i >> j;
        Q[index] = QueryNode(i - 1, j, index, N);
    }
    sort(Q, Q + M);

    // ์ฒซ ๋ฒˆ์งธ์— ์œ„์น˜ํ•œ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋Š” ์†์ˆ˜ ๊ตฌํ•จ
    int dcnt = 0, cnt[MAX_VAL + 1]{};
    int i0 = Q[0].i, j0 = Q[0].j;
    for (int i = i0; i < j0; ++i)
        if (cnt[A[i]]++ == 0)
            ++dcnt;

    result[Q[0].index] = dcnt;

    // ๋‹ค์Œ ์ฟผ๋ฆฌ๋ถ€ํ„ฐ ๋ฐ”๋กœ ์ด์ „ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•ด ๊ณ„์‚ฐํ•ด ๋‚˜๊ฐ
    for (int i = 1; i < M; ++i) {
        while (Q[i].i < i0) if (cnt[A[--i0]]++ == 0) ++dcnt;
        while (j0 < Q[i].j) if (cnt[A[j0++]]++ == 0) ++dcnt;
        while (Q[i].i > i0) if (--cnt[A[i0++]] == 0) --dcnt;
        while (j0 > Q[i].j) if (--cnt[A[--j0]] == 0) --dcnt;
        result[Q[i].index] = dcnt;
    }

    for (int i = 0; i < M; ++i)
        cout << result[i] << "\n";
}
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Computer Science/โœ Algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ฆฌ
  • [C++] ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(Linked List)
  • [C++] ๋ˆ„์  ํ•ฉ(Prefix sum)
  • [C++] ์ค‘๊ฐ„์—์„œ ๋งŒ๋‚˜๊ธฐ(Meet In The Middle)
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++] ํ‰ํ–‰ ๋ถ„ํ• , ๋ชจ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜
์ƒ๋‹จ์œผ๋กœ

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