티스토리 뷰

Algorithm

[백준 5854] Painting the Fence

devbelly 2021. 7. 29. 12:57

문제

https://www.acmicpc.net/problem/5854

 

알고리즘

Sorting

 

풀이

K번 겹치는 선분의 길이를 구하는 문제입니다.

 

세그먼트트리 문제에서 직사각형 관련 문제를 풀 때 비슷하게 풀어본 적이 있는 것 같습니다. 주어진 선분을 모두 구한 후 각 선분마다 선분의 왼쪽 점과 오른쪽 점을 구분합니다. 벡터에 넣어 정렬한 후, 만일 현재점이 선분의 왼쪽을 구성하는 점이라면 psum값을 1증가시키고 선분의 오른쪽을 구성하는 점이라면 psum값을 1감소시킵니다. psum은 현재 겹쳐진 횟수를 의미하며 해당 값이 K이상일때만 ans에 기록하여 문제를 풀었습니다. 

 

코드

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; ++i)
#define REP(i, n) for (int i = 1; i <= n; ++i)
using namespace std;

typedef pair<int, int> pii; // second 0 : left 1:right

int N, K, mv, cur, ans, psum;
char dir;

vector<pii> vt;

int main() {
#ifndef ONLINE_JUDGE
    freopen("in", "r", stdin);
    freopen("out", "w", stdout);
#endif
    cin.tie(NULL);
    cout.tie(NULL);
    ios::sync_with_stdio(false);

    cin >> N >> K;
    rep(i, N) {
        cin >> mv >> dir;
        if (dir == 'L') {
            vt.emplace_back(cur, 1);
            cur -= mv;
            vt.emplace_back(cur, 0);
        } else {
            vt.emplace_back(cur, 0);
            cur += mv;
            vt.emplace_back(cur, 1);
        }
    }
    sort(vt.begin(), vt.end());
    for (auto [pos, typ] : vt) {
        ans += (pos - cur) * (psum >= K);
        psum += (!typ ? 1 : -1);
        cur = pos;
    }
    cout << ans;
    return 0;
}

'Algorithm' 카테고리의 다른 글

[백준 1398] 동전 문제  (0) 2021.08.04
[백준 5900] Cow IDs  (0) 2021.08.03
[백준 5849] Cow Crossings  (0) 2021.07.22
[백준 5832] Photo  (0) 2021.07.21
[백준 5872] Clumsy Cows  (0) 2021.07.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함