※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1666번 문제인 최대 증가 직사각형 집합이다.
문제는 아래 링크를 확인하자.

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

 

1666번: 최대 증가 직사각형 집합

첫째 줄에 직사각형의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1번째 줄까지 i+1번째 줄에 i번째 직사각형의 왼쪽 아래 점의 x좌표, y좌표 오른쪽 위의 점의 x좌표, y좌표를 나타내는 4개

www.acmicpc.net

이 문제를 간단히 한 버전, 즉 평면 위에 직사각형이 아닌 점이 찍혀있는 문제는 sweeping을 통한 LIS 풀이가 잘 알려져있다.

 

이를 간단히 응용하면 세그먼트 트리를 이용한 LIS의 길이 구하기를 응용한 풀이를 똑같이 적용할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <vector>
#include <map>
#include <queue>
using namespace std;
typedef pair<int, int> pt;

multimap<pt, pt> mltmap;
priority_queue<pair<pt, int>> pq;

int seg[262145];

int update(int L, int R, int qI, int qVal, int sI) {
	if (R < qI || qI < L) return seg[sI];
	if (L == R) return seg[sI] = max(seg[sI], qVal);
	return seg[sI] = max(update(L, (L + R) / 2, qI, qVal, sI * 2), update((L + R) / 2 + 1, R, qI, qVal, sI * 2 + 1));
}

int query(int L, int R, int qL, int qR, int sI) {
	if (R < qL || qR < L) return 0;
	if (qL <= L && R <= qR) return seg[sI];
	return max(query(L, (L + R) / 2, qL, qR, sI * 2), query((L + R) / 2 + 1, R, qL, qR, sI * 2 + 1));
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N; cin >> N;
	for (int i = 0; i < N; i++) {
		int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2;
		x1 = -x1; x2 = -x2;
		y1++; y2++;
		pt spoint = { x1,y1 }, epoint = { x2,y2 };
		mltmap.insert({ spoint, epoint });
		pq.push({ spoint,0 });
	}

	while (!pq.empty()) {
		pt current = pq.top().first;
		int cnt = pq.top().second;
		pq.pop();
		if (cnt == 0) {
			auto iters = mltmap.equal_range(current);
			for (auto iter = iters.first; iter != iters.second; iter++) {
				pq.push(pair<pt,int> { (*iter).second, query(1,100001,1,current.second - 1,1) + 1 });
			}
		}
		else {
			update(1, 100001, current.second, cnt, 1);
		}
	}

	cout << query(1, 100001, 1, 100001, 1);
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 1111 // C++] IQ Test  (0) 2021.06.21
[BOJ 5397 // C++] 키로거  (0) 2021.06.20
[BOJ 4195 // C++] 친구 네트워크  (0) 2021.06.18
[BOJ 20040 // C++] 사이클 게임  (0) 2021.06.17
[BOJ 17131 // C++] 여우가 정보섬에 올라온 이유  (0) 2021.06.16

+ Recent posts