Skip to main content

Sqrt_decomposition

BOJ 30478 Candy Rush

·512 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/30478 ๋ฌธ์ œ # ๋Ÿฌ์‹œ์•„์›Œ์ž…๋‹ˆ๋‹ค! ์˜ค๋Š˜ ํ‡ด๊ทผ ํ›„, ์‡ผํ•‘๋ชฐ์ด ๋‹ซ๊ธฐ ์ „์— ๊ฐ€์กฑ ๋ชจ๋‘์—๊ฒŒ ์ค„ ์‚ฌํƒ•์„ ์‚ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์กฑ๋“ค์€ ๋…์ ์„ฑ๊ณผ ๊ท ์ผ์„ฑ์„ ๋งค์šฐ ์ค‘์š”ํ•˜๊ฒŒ ์—ฌ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹น์‹ ์€ ๊ทธ๋“ค์„ ๊ฐ๋™์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๊ณ„ํš์„ ์„ธ์› ์Šต๋‹ˆ๋‹ค. ๊ฐ ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์—๊ฒŒ ์ฃผ๋Š” ์‚ฌํƒ•์€ ๋ชจ๋‘ ๋‹จ์ผ ๋ธŒ๋žœ๋“œ์—ฌ์•ผ ํ•˜๋ฉฐ, ๋™์ผํ•œ ๋ธŒ๋žœ๋“œ์˜ ์‚ฌํƒ•์„ ๋‹ค๋ฅธ ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์ด ๋ฐ›์•„์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋” ์‚ฌ๋ž‘ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋“คํ‚ค๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๊ฐ€์กฑ ๊ตฌ์„ฑ์›์ด ๊ฐ™์€ ์ˆ˜์˜ ์‚ฌํƒ•์„ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

BOJ 2042 ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ

·351 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/2042 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์ž๋ช…ํ•œ ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ ์—ฐ์Šต ๋ฌธ์ œ์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์—†์ด ๊ตฌ๊ฐ„์˜ ํ•ฉ์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์ด๋Š” ๋ˆ„์ ํ•ฉ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ์ฟผ๋ฆฌ๋Š” $O(1)$, ์—…๋ฐ์ดํŠธ๋Š” $O(N)$์ด๋‹ค. ์—…๋ฐ์ดํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„ , ํ•ฉ์„ ๋‚˜์ด๋ธŒํ•˜๊ฒŒ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๊ฒ ๋‹ค. ์ด๋•Œ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ์ฟผ๋ฆฌ๋Š” $O(N)$, ์—…๋ฐ์ดํŠธ๋Š” $O(1)$์ด๋‹ค. ๋ฒ„ํ‚ท์„ ์ž˜ ๋‚˜๋ˆ„์–ด์„œ, ๋‘ ๋ฐฉ๋ฒ•์˜ ์ด๋“๋งŒ์„ ์ทจํ•˜๋ฉด ์ œ๊ณฑ๊ทผ ๋ถ„ํ• ๋ฒ•์„ ์ด์šฉํ•ด์„œ $O(Q\sqrt{N})$๊นŒ์ง€ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ , ํ•ด๋‹น ๋ฌธ์ œ์—์„œ๋Š” $N \leq 10^6$์ด๋ฏ€๋กœ ์•ฝ 2์ฒœ๋งŒ์ •๋„์— ๋ฐ”์šด๋“œ๋œ๋‹ค. ์ง€๊ธˆ๊ณผ ๊ฐ™์ด ๋‘ ๋…ธ๋“œ๋ฅผ ํ•ฉ์น˜๋Š” ๊ฒƒ์ด ์ง๊ด€์ ์ด๊ณ  ์šฉ์ดํ•  ๊ฒฝ์šฐ์—๋Š” ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‘ ๋…ธ๋“œ๋ฅผ ์ด์šฉํ•ด ์—ญ์›๊ณผ ์—ญ์—ฐ์‚ฐ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ํŽœ์œ…ํŠธ๋ฆฌ๋„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ ll N, M, K; cin >> N >> M >> K; SegmentTreeSum ST(N); rep(i, 0, N){ ll x; cin >> x; ST.set(i, x); } ST.build(); rep(i, 0, M+K){ ll a, b, c; cin >> a >> b >> c; if(a == 1) ST.update(b-1, c - ST.query(b-1, b-1)); else cout << ST.query(b-1, c-1) << "\n"; } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 14504 ์ˆ˜์—ด๊ณผ ์ฟผ๋ฆฌ 18

·245 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/14504 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์ˆ˜์—ด๊ณผ ์ฟผ๋ฆฌ 1๊ณผ ๋น„์Šทํ•œ๋ฐ, ์—…๋ฐ์ดํŠธ ์ฟผ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€๋˜, ๋ฐฐ์—ด ์ •๋ ฌ ๋ง๊ณ  multiset์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ? ํ—‰, multiset์—์„œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ• ๋•Œ ์“ฐ๋Š” distanceํ•จ์ˆ˜๊ฐ€ $O(N)$์ด๋ผ๊ณ  ํ•œ๋‹ค!! ์–ด์ฐจํ”ผ ๋ฒ„ํ‚ท์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘์œผ๋‹ˆ, ๋‚˜์ด๋ธŒํ•˜๊ฒŒ ์ •๋ ฌํ•ด๋ฒ„๋ ค๋„ ๋ฌธ์ œ๊ฐ€ ์—†๊ฒ ๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): const int sq = 700; struct sqrtDecomposition{ int N; vector<int> A; vector<vector<int>> bucket; sqrtDecomposition(int N, vector<int> &A): N(N), A(A){ bucket.resize((N-1)/sq+1); rep(i, 0, N) bucket[i/sq].push_back(A[i]); for(int i = 0; i < (int)bucket.size(); i++) sort(all(bucket[i])); }; void update(int i, int val){ int b = i/sq; auto it = lower_bound(all(bucket[b]), A[i]); *it = val; A[i] = val; sort(all(bucket[b])); } int query(int L, int R, int val){ int ret = 0; for(int i = L; i <= R;){ if(i%sq == 0 && i+sq-1 <= R){ ret += bucket[i/sq].end() - upper_bound(all(bucket[i/sq]), val); i += sq; } else{ ret += A[i] > val; i++; } } return ret; } }; void solve(){ int N; cin >> N; vector<int> A(N); rep(i, 0, N) cin >> A[i]; sqrtDecomposition sd(N, A); int Q; cin >> Q; while(Q--){ int op; cin >> op; if(op == 1){ int i, j, k; cin >> i >> j >> k; cout << sd.query(i-1, j-1, k) << "\n"; } else{ int i, k; cin >> i >> k; sd.update(i-1, k); } } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 13537 ์ˆ˜์—ด๊ณผ ์ฟผ๋ฆฌ 1

·225 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/13537 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋ถ€๋ถ„์ˆ˜์—ด์—์„œ ๋ฌผ์–ด๋ณด๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์žˆ์œผ๋‹ˆ, ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๊ฐ€ ๋จผ์ € ์ƒ๊ฐ์ด ๋‚œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ฟผ๋ฆฌ๊ฐ€ ์ข€ ๊นŒ๋‹ค๋กญ๋‹ค. ์ด๋Ÿด๋•Œ, $N, M$๋ชจ๋‘ 10๋งŒ์ด๋ฏ€๋กœ ์ œ๊ณฑ๊ทผ ๋ถ„ํ• ๋ฒ•์„ ํ•œ๋ฒˆ ์ƒ๊ฐํ•ด๋ณด์ž. ์ˆ˜๊ฐ€ $C$๊ฐœ ๋“ค์–ด์žˆ๋Š” ๋ฒ„ํ‚ท์„ $B$๊ฐœ ๋งŒ๋“ ๋‹ค๋ฉด $(C = N/B$), ๋ฒ„ํ‚ท ๋‚ด์˜ ์ˆ˜๋“ค์„ ์ •๋ ฌํ•˜๋Š”๋ฐ $O(B \times C\log{C})$, ๋ฒ„ํ‚ท๋“ค์— ๋Œ€ํ•ด ๋‹ต์„ ๊ตฌํ•˜๋Š”๋ฐ์— $O(B \times \log{C})$ ๋”ฐ๋ผ์„œ ์ด๋“ค์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ ๋‹นํžˆ $\sqrt{N}$๋ณด๋‹ค ์•ฝ๊ฐ„ ํฌ๊ฒŒ ์žก์œผ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): const int sq = 700; struct sqrtDecomposition{ int N; vector<int> A; vector<vector<int>> bucket; sqrtDecomposition(int N, vector<int> &A): N(N), A(A){ bucket.resize((N-1)/sq+1); rep(i, 0, N) bucket[i/sq].push_back(A[i]); for(int i = 0; i < (int)bucket.size(); i++) sort(all(bucket[i])); }; int query(int L, int R, int val){ int ret = 0; for(int i = L; i <= R;){ if(i%sq == 0 && i+sq-1 <= R){ ret += bucket[i/sq].end() - upper_bound(all(bucket[i/sq]), val); i += sq; } else{ ret += A[i] > val; i++; } } return ret; } }; void solve(){ int N; cin >> N; vector<int> A(N); rep(i, 0, N) cin >> A[i]; sqrtDecomposition sd(N, A); int Q; cin >> Q; while(Q--){ int i, j, k; cin >> i >> j >> k; cout << sd.query(i-1, j-1, k) << "\n"; } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 18180 Saba1000kg

·584 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/18180 ๋ฒˆ์—ญ ๋ฌธ์ œ ๋ฒˆ์—ญ # ๋ฐ”์ดํ‚น ๋ฝ ์šด๋™์—๋Š” ๋‹ค์–‘ํ•œ ํ๋ฆ„์ด ์กด์žฌํ•œ๋‹ค. ์˜ฌ๋“œ ์•„์ด์Šฌ๋ž€๋“œ ๊ทธ๋ž˜๋‹ˆํŠธ ๋ฝ, ๋ฏธ๋“ค ๋ฐ๋‹ˆ์‰ฌ ๋”์Šคํ‹ฐ ๋ฐ”์ดํ‚น ๋ฝ, ๋ ˆ์ดํŠธ ํ•€๊ฒŒ์ผ ๋‹คํฌ ๊ทธ๋ฆฐ ๋ฝ, ํ”ผ์˜ค๋ฅด๋“œ ๋ณผ๋” ์•„๋ฐœ๋ž€์ฒด ๋ฝ ๋“ฑ, ์ธ๊ธฐ ์žˆ๋Š” ํ๋ฆ„์˜ ์ „์ฒด ๋ชฉ๋ก์„ ๋‚˜์—ดํ•˜๋ฉด ์ด ํŽ˜์ด์ง€๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฐ€๋“ ์ฑ„์šธ ์ •๋„์ด๋‹ค. ์Šค์นธ๋””๋‚˜๋น„์•„ ๊ณ ๋“ฑ๊ต์œก๋ถ€๋Š” ์ด๋Ÿฌํ•œ ํ๋ฆ„๋“ค์ด ์„œ๋กœ ์–ด๋–ป๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ๋Š”์ง€ ์—ฐ๊ตฌํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋“ค์€ ํ˜„์žฌ ๋Œ€๊ทœ๋ชจ ์‹คํ—˜์„ ๊ณ„ํš ์ค‘์ด๋ฉฐ, ์ ์ ˆํžˆ ์„ ๋ฐœ๋œ ์ž์›๋ด‰์‚ฌ์ž๋“ค์„ ๋ฌด์ธ๋„๋“ค๋กœ ๊ตฌ์„ฑ๋œ ๊ตฐ๋„์— ๋ฐฐ์น˜ํ•˜์—ฌ ์ƒ๋Œ€์ ์œผ๋กœ ๊ธด ์‹œ๊ฐ„ ๋™์•ˆ ๊ทธ๋“ค์˜ ์Œ์•…์  ์Šคํƒ€์ผ๊ณผ ์„ ํ˜ธ๋„๊ฐ€ ์„œ๋กœ ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๊ด€์ฐฐํ•˜๊ณ ์ž ํ•œ๋‹ค.