BOJ 14587 ๋๋ฏธ๋ ธ (Large)
·224 words·2 mins
๐ ๋ฌธ์ ์ ๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/14587 ๐ง ๊ด์ฐฐ ๋ฐ ์ ๊ทผ # ์ ์ฒ๋ฆฌ๋ฅผ ์ ๋นํ ํ ์ ์์๊น? ์ด๋ถํ์์ ์ข ํ๋ฉด์ ๋ฐ๋ฉด์ ํ๋ฉด, ํน์ ๋๋ฏธ๋
ธ๋ฅผ ํ์ชฝ์ผ๋ก ๋ฐ์์๋ ์ด๋๊น์ง ๋์ด๊ฐ๋์ง ํ ์ ์๋? ์, min/max ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ๋ก ๋๋๊ฑฐ๊ฐ๋ค ๋ง์ง๋ง์ ๊ทธ๋ฆฌ๋๊ฐ ์๋๋ผ DP๋ก ํด์ผํ๋ค! ์๋๊ทผ๋ฐ X๊ฐ ์ ๋ ฌ๋์ด ์ฃผ์ด์ง์ง ์๋๋ค;;;;; ๊ทธ๋๋ ๊ตฌํ์ด ๋ง ์ด๋ ต์ง ์์๋ฏ ๐ป ํ์ด # ์ฝ๋ (C++): void solve(){ int N; cin >> N; vector<ll> X(N), H(N); vector<pll> dominos(N); rep(i, 0, N) cin >> dominos[i].first >> dominos[i].second; sort(all(dominos)); rep(i, 0, N){ X[i] = dominos[i].first; H[i] = dominos[i].second; } SegmentTreeMinMax ST_min(N), ST_max(N); // calc leftmost ST_min.set(0, 0); rep(i, 1, N){ ll val = X[i] - H[i]; auto idx = lower_bound(all(X), val) - X.begin(); auto Q = ST_min.query(idx, i-1); ST_min.set(i, min((ll)i, ST_min.query(idx, i-1).first)); } // calc rightmost ST_max.set(N-1, N-1); rrep(i, 0, N-1){ ll val = X[i] + H[i]; auto idx = upper_bound(all(X), val) - X.begin() - 1; auto Q = ST_min.query(i+1, idx); ST_max.set(i, max((ll)i, ST_max.query(i+1, idx).second)); } vector<int> DP(N, 1e9); DP[0] = 1; DP[ST_max.get_val(0)] = 1; rep(i, 1, N){ int lft = ST_min.get_val(i)-1; if(lft < 0) DP[i] = 1; else DP[i] = min(DP[i], DP[lft] + 1); int rht = ST_max.get_val(i); DP[rht] = min(DP[rht], DP[i-1] + 1); } cout << DP[N-1]; } ๐ ๊ตฌํ ์ฝ๋ ์ ๊ธ