안녕하세요. 오늘은 교집합을 구해볼 거예요.
https://www.acmicpc.net/problem/11665
직육면체의 교집합은 x,y,z의 교집합을 구하면 구할 수 있습니다.
x끼리의 교집합, y끼리의 교집합, z끼리의 교집합을 구하면 그 길이들을 다 곱해서 정답을 얻을 수 있습니다.
merge함수를 만들어서 두 구간의 교집합을 빠르게 구할겁니다.
#include <iostream>
#include <vector>
#define pii pair <int,int>
using namespace std;
pii merge(pii A, pii B) //구간 합치기
{
pii ans;
ans.first = max(A.first, B.first);
ans.second = min(A.second, B.second);
return ans;
}
int main(void)
{
ios_base::sync_with_stdio(false); cin.tie(NULL);
int N, i, x1, y1, z1, x2, y2, z2;
vector <pii> X, Y, Z;
cin >> N;
for (i = 0; i < N; i++)
{
cin >> x1 >> y1 >> z1 >> x2 >> y2 >> z2;
X.push_back({ x1,x2 });
Y.push_back({ y1,y2 });
Z.push_back({ z1,z2 });
}
pii x = { -2e9,2e9 }, y = { -2e9,2e9 }, z = { -2e9,2e9 };
for (i = 0; i < N; i++)
{
x = merge(x, X[i]);
y = merge(y, Y[i]);
z = merge(z, Z[i]);
}
cout << max(0, x.second - x.first) * max(0, y.second - y.first) * max(0, z.second - z.first);
}
감사합니다.
개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.