티스토리 뷰
문제
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
링크
TAG
- implementation
- dfs
- Fenwick
- 펜윅트리
- knapsack
- Suffix Array
- hld
- spring
- kmp
- 동적계획법
- 좌표압축
- 2-SAT
- dijkstra
- bfs
- 이분탐색
- spring boot
- 정렬
- sorting
- greedy
- sweeping
- 세그먼트트리
- 이분매칭
- DP
- 트라이
- 스위핑
- Segment tree
- string
- Oracle
- union find
- SCC
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함