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; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ