Skip to main content

Bitset

BOJ 35108 ๊ฒŒ๊ตญ์ง€

·433 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/35108 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # $N$์ด 2500์ด๋‹ˆ๊นŒ ๋ญ”๊ฐ€ ์ œ๊ณฑ๋กœ๊ทธ?๊นŒ์ง„ ๋Œ์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค. ์Œ, ์–ด๋–ป๊ฒŒ ์žก์œผ๋ฉด ์ข‹์„์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ์ € ์ฃผ์–ด์ง„ ๊ฒŒ๊ตญ์ง€ ๊ทธ๋ž˜ํ”„์—์„œ ์•ˆ์ชฝ์˜ ๋„ค๋ชจ์ค‘ ์™ผ์ชฝ ์œ„๋ถ€ํ„ฐ ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ $1, 2, 3, 4$ ๋ผ๊ณ  ํ•˜๋ฉด, $2, 4$๋ฒˆ ์ •์ ์„ ๊ธฐ์ค€์œผ๋กœ ์นด์šดํŒ…ํ•˜๊ณ ์‹ถ๊ฒŒ ์ƒ๊ธฐ๊ธด ํ–ˆ๋‹ค. ์ผ๋‹จ ์˜ˆ์ œ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค๋ณด์ž. ![[Drawing 2026-03-07 09.54.26.excalidraw.png]] ์—ฌ๊ธฐ์„œ ์ € ๊ฒŒ๊ตญ์ง€๋ชจ์–‘์„ ์ฐพ์•„์•ผ ํ•˜๋Š”๋ฐ… $1, 2, 3, 4$๋ฅผ ๊ธฐ7์ค€์œผ๋กœ ํ•˜๋ฉด $1, 2, 4$์— $5, 7, 6$์„ ๋ถ™์ด๊ฑฐ๋‚˜, $6, 7, 5$๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๊ฒ ๋‹ค. ์–ด.. ์ •์ ์„ ๊ธฐ์ค€์œผ๋กœ ์„ธ๋ ค๊ณ  ํ•˜๋‹ˆ ์ข€ ๊นŒ๋‹ค๋กœ์šด๊ฑฐ ๊ฐ™๊ธฐ๋„..? ๊ทธ๋Ÿฌ๋ฉด ๊ฐ„์„ ์„ ๊ธฐ์ค€์œผ๋กœ..? ๊ทธ๋Ÿฌ๋ฉด ์•„๋ฌด๋ž˜๋„ ์–‘์ชฝ์— ๋‚ ๊ฐœ๊ฐ€ ๋ถ™์–ด์žˆ๋Š” ๊ฐ„์„ ์œผ๋กœ ์ƒ๊ฐํ•˜์ž. ํฌ์•„์•„์•„์•… ์ด๋ž˜๋„ ์•ˆ๋˜๋Š”๋ฐ ์ผ๋‹จ ๋‘ ๊ฐ„์„ ์„ ๊ณจ๋ผ์„œ ์‚ฌ์ดํด์„ ๊ณ ์ •์‹œํ‚ค๋Š”๊ฑด ๋งž๋Š”๊ฑฐ๊ฐ™๋‹ค. ์ž‰ ์ด๋Ÿฌ๋ฉด ๊ฑ ํฌํ•จ๋ฐฐ์ œ๋กœ ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€? ๊ทธ๋Ÿฌ๋ฉด ๋‘ ์ •์ ์— ์ค‘๋ณต๋˜๋Š” ์ •์ , ์„ธ ์ •์ ์— ์ค‘๋ณต๋˜๋Š” ์ •์  ๋ญ ๊ทธ๋Ÿฐ๊ฒŒ ํ•„์š”ํ•œ๊ฑฐ๊ฐ™์€๋ฐ… ๋น„ํŠธ์…‹์œผ๋กœ ํ•˜๋ฉด ๋ ๋ผ๋‚˜? $O(M^2N/64)$ ์ •๋„์ธ๊ฑฐ๊ฐ™์€๋ฐ;; ์ผ๋‹จ ์งœ๋ณด์ž ์ข€ ๋นก๋นกํ•˜๋‹ค. ์ „์ฒ˜๋ฆฌ๋ฅผ ์ž˜ ํ•˜๋ฉด ์‹œ๊ฐ„ ๋‚ด๋กœ ๋“ค์–ด๊ฐ„๋‹ค. Clang์ด ํ›จ ๋น ๋ฅด๋„ค. ์™œ์ง€? ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, M; cin >> N >> M; vector<pii> edges; vector<bitset<2500>> con(N); rep(i, 0, M){ int u, v; cin >> u >> v; u--; v--; edges.push_back({u, v}); con[u][v] = 1; con[v][u] = 1; } vector<ll> cnt1(N); rep(i, 0, N) cnt1[i] = con[i].count(); vector<vector<bitset<2500>>> con2(N, vector<bitset<2500>>(N)); rep(i, 0, N) rep(j, i+1, N) con2[i][j] = con2[j][i] = con[i]&con[j]; vector<vector<ll>> cnt2(N, vector<ll>(N)); rep(i, 0, N) rep(j, i+1, N) cnt2[i][j] = cnt2[j][i] = con2[i][j].count(); auto calc = [&](int v1, int v2, int v3, int v4) -> ll { auto &b1 = con[v1], &b2 = con[v2], &b3 = con[v3]; ll n1 = cnt1[v1] - (con[v1][v2] + con[v1][v3] + con[v1][v4]); ll n2 = cnt1[v2] - (con[v2][v1] + con[v2][v3] + con[v2][v4]); ll n3 = cnt1[v3] - (con[v3][v1] + con[v3][v2] + con[v3][v4]); ll n12 = cnt2[v1][v2] - (con2[v1][v2][v3] + con2[v1][v2][v4]); ll n23 = cnt2[v2][v3] - (con2[v2][v3][v1] + con2[v2][v3][v4]); ll n31 = cnt2[v3][v1] - (con2[v3][v1][v2] + con2[v3][v1][v4]); bitset<2500> b123 = b1&b2&b3; ll n123 = b123.count() - b123[v4]; return n1*n2*n3 - (n12*n3 + n23*n1 + n31*n2) + 2*n123; }; ll ans = 0; rep(i, 0, M) rep(j, i+1, M){ auto [a, b] = edges[i]; auto [c, d] = edges[j]; if(a == c || a == d || b == c || b == d) continue; if((!con[a][c] || !con[b][d]) && (!con[a][d] || !con[b][c])) continue; ll ret = 0; ret += calc(a, b, c, d); ret += calc(b, c, d, a); ret += calc(c, d, a, b); ret += calc(d, a, b, c); if(con[a][c] && con[b][d]) ans += ret; if(con[a][d] && con[b][c]) ans += ret; } cout << ans/2; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 26857 Cell Game

·858 words·5 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/26857 ๋ฒˆ์—ญ ๋ฌธ์ œ ๋ฒˆ์—ญ # ๋‘ ํ˜•์ œ Aldo์™€ Bondan์€ COVID-19 ํŒฌ๋ฐ๋ฏน ์ƒํ™ฉ์ด ์•…ํ™”๋˜์–ด ๋„์‹œ๊ฐ€ ๋‹ค์‹œ ๋ด‰์‡„๋˜๋ฉด์„œ ์ง‘์— ๊ฐ‡ํ˜€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ํ•™๊ธฐ๋ฅผ ๋งˆ์น˜๊ณ  ๋ฐฉํ•™ ์ค‘์ด์ง€๋งŒ, ์ง‘ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด ๋ฌด์Šจ ๋ฐฉํ•™์„ ์ฆ๊ธธ ์ˆ˜ ์žˆ์„๊นŒ์š”? ํ•˜์ง€๋งŒ ์ง€๋ฃจํ•จ์€ ์ฐฝ์˜์„ฑ์„ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ง€๋ฃจํ•œ ๋ฐฉํ•™ ๋™์•ˆ ์ƒˆ๋กœ์šด ๊ฒŒ์ž„์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.