-
KOI 2019 1차 중등부 2번 / 직각다각형 - 17611Algorithm/BOJ 2020. 8. 24. 12:10123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869#include <iostream>#include <queue>using namespace std;int N;struct Node {int idx;char label;};bool operator<(const Node& n1, const Node& n2) {if(n1.idx == n2.idx) return n1.label < n2.label;return n1.idx < n2.idx;}priority_queue<Node> pq[2];void mkpq(int u1, int u2, int v1, int v2) {Node x1, x2, y1, y2;x1.label = y1.label = 's';x2.label = y2.label = 'e';x1.idx = max(u1, u2);x2.idx = min(u1, u2);y1.idx = max(v1, v2);y2.idx = min(v1, v2);pq[0].push(x1); pq[0].push(x2);pq[1].push(y1); pq[1].push(y2);}int Cnt(priority_queue<Node>& pq) {int ret = 0;int cnt = 0;int bidx = -1000000;while(!pq.empty()) {Node n = pq.top();pq.pop();if(bidx == n.idx) {if(n.label == 's') ++cnt;else --cnt;}else {ret = max(ret, cnt);bidx = n.idx;++cnt;}}return ret;}int main() {ios_base::sync_with_stdio(0), cin.tie(0);cin >> N;int u, v, su, sv, bu, bv;cin >> su >> sv;bu = su, bv = sv;for(int i = 0; i<N-1; ++i) {cin >> u >> v;mkpq(u, bu, v, bv);bu = u, bv = v;}mkpq(u, su, v, sv);int ans = 0;ans = max(ans, Cnt(pq[0]));ans = max(ans, Cnt(pq[1]));cout << ans;}
cs https://www.acmicpc.net/problem/17611
17611번: 직각다각형
입력의 첫 줄에는 단순직각다각형의 꼭지점의 개수를 나타내는 정수 n(4 ≤ n ≤ 100,000)이 주어지고, 이어지는 n개 줄 각각에 단순직각다각형 꼭지점의 좌표 (xi, yi)가 차례대로 주어진다. 주어지��
www.acmicpc.net
직각다각형
세로축에 평행한 선분들을 추출해서 가장 많이 겹치는 곳이 몇번 겹치는지 세고,
가로축에 평행한 선분들을 추출해서 가장 많이 겹치는 곳이 몇번 겹치는지 세어서
그중 가장 많이 겹치는 것을 정답으로 출력 하면 됩니다.
lazy propagation을 사용해도 되지만, 사실 각각 선분의 꼭지점이 시작점인지 끝점인지만 구분해서 시작점이면 ++cnt, 끝점이면 --cnt를 해준다면 더 쉽게 셀 수 있습니다.
문제의 조건에서 수평선 H, V는 어떤 선분과도 겹치면 안된다는 성질만 조심하면 쉽게 해결 할 수 있습니다.
'Algorithm > BOJ' 카테고리의 다른 글
KOI 2018 초등부 1번 / 행복 - 15969 (0) 2020.08.24 KOI 2019 1차 고등부 1번 / 쇼핑몰 - 17612 (0) 2020.08.24 KOI 2019 1차 중등부 1번 / 양팔저울 - 17610 (0) 2020.08.13 KOI 2019 1차 초등부 2 / 회문 - 17609 (0) 2020.08.13 UCPC 2020 C / 함수 복원 - 19544 (0) 2020.08.05