안녕하세요. 오늘은 교집합을 구해볼 거예요.

문제

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);
}


감사합니다.

1개의 댓글

comment-user-thumbnail
2023년 11월 14일

개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.

답글 달기