·512 words·3 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/30478 ๋ฌธ์ # ๋ฌ์์์์
๋๋ค! ์ค๋ ํด๊ทผ ํ, ์ผํ๋ชฐ์ด ๋ซ๊ธฐ ์ ์ ๊ฐ์กฑ ๋ชจ๋์๊ฒ ์ค ์ฌํ์ ์ฌ์ผ ํฉ๋๋ค.
๊ฐ์กฑ๋ค์ ๋
์ ์ฑ๊ณผ ๊ท ์ผ์ฑ์ ๋งค์ฐ ์ค์ํ๊ฒ ์ฌ๊ธฐ๊ธฐ ๋๋ฌธ์, ๋น์ ์ ๊ทธ๋ค์ ๊ฐ๋์ํค๊ธฐ ์ํ ๊ณํ์ ์ธ์ ์ต๋๋ค. ๊ฐ ๊ฐ์กฑ ๊ตฌ์ฑ์์๊ฒ ์ฃผ๋ ์ฌํ์ ๋ชจ๋ ๋จ์ผ ๋ธ๋๋์ฌ์ผ ํ๋ฉฐ, ๋์ผํ ๋ธ๋๋์ ์ฌํ์ ๋ค๋ฅธ ๊ฐ์กฑ ๊ตฌ์ฑ์์ด ๋ฐ์์๋ ์ ๋ฉ๋๋ค. ๋ํ, ๋๊ตฐ๊ฐ๋ฅผ ๋ ์ฌ๋ํ๋ค๋ ์ฌ์ค์ ๋คํค๊ณ ์ถ์ง ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฐ์กฑ ๊ตฌ์ฑ์์ด ๊ฐ์ ์์ ์ฌํ์ ๋ฐ์์ผ ํฉ๋๋ค.
·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"; } } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·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); } } } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·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"; } } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ
·584 words·3 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/18180 ๋ฒ์ญ ๋ฌธ์ ๋ฒ์ญ # ๋ฐ์ดํน ๋ฝ ์ด๋์๋ ๋ค์ํ ํ๋ฆ์ด ์กด์ฌํ๋ค. ์ฌ๋ ์์ด์ฌ๋๋ ๊ทธ๋๋ํธ ๋ฝ, ๋ฏธ๋ค ๋ฐ๋์ฌ ๋์คํฐ ๋ฐ์ดํน ๋ฝ, ๋ ์ดํธ ํ๊ฒ์ผ ๋คํฌ ๊ทธ๋ฆฐ ๋ฝ, ํผ์ค๋ฅด๋ ๋ณผ๋ ์๋ฐ๋์ฒด ๋ฝ ๋ฑ, ์ธ๊ธฐ ์๋ ํ๋ฆ์ ์ ์ฒด ๋ชฉ๋ก์ ๋์ดํ๋ฉด ์ด ํ์ด์ง๋ฅผ ์ฌ๋ฌ ๋ฒ ๊ฐ๋ ์ฑ์ธ ์ ๋์ด๋ค. ์ค์นธ๋๋๋น์ ๊ณ ๋ฑ๊ต์ก๋ถ๋ ์ด๋ฌํ ํ๋ฆ๋ค์ด ์๋ก ์ด๋ป๊ฒ ์ํฅ์ ์ฃผ๋์ง ์ฐ๊ตฌํ๊ณ ์๋ค. ๊ทธ๋ค์ ํ์ฌ ๋๊ท๋ชจ ์คํ์ ๊ณํ ์ค์ด๋ฉฐ, ์ ์ ํ ์ ๋ฐ๋ ์์๋ด์ฌ์๋ค์ ๋ฌด์ธ๋๋ค๋ก ๊ตฌ์ฑ๋ ๊ตฐ๋์ ๋ฐฐ์นํ์ฌ ์๋์ ์ผ๋ก ๊ธด ์๊ฐ ๋์ ๊ทธ๋ค์ ์์
์ ์คํ์ผ๊ณผ ์ ํธ๋๊ฐ ์๋ก ๋ฏธ์น๋ ์ํฅ์ ๊ด์ฐฐํ๊ณ ์ ํ๋ค.