题目
思路
意识到本题的数据规模可以暴力去做!
- \(N=100\),\(N^3\)直接遍历整个空间可做;
- 立方体间不相交,也就是可以直接遍历立方体中的所有点进行标记,不会超过整体空间体积;
- 立方体不相交,也就是说同一个位置尽可能被标记一次;
- 将空间中每个立方体所占点进行标记,而后枚举每个立方体的外侧6个面,统计其中标记个数;
- 注意:输入的是对角线上的顶点坐标,而这里使用的是所占小立方体的坐标,因而需要对坐标较大者减一;
代码
点击查看代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <set>
using namespace std;
using LL = long long;
using PII = pair<int, int>;
const int N = 110, M = 1e5 + 10;
int b[N][N][N];
struct Node
{
int x1, y1, z1, x2, y2, z2;
}a[M];
void solv()
{
int n; cin >> n;
for (int i = 1; i <= n; i ++)
{
int x1, y1, z1, x2, y2, z2;
cin >> x1 >> y1 >> z1 >> x2 >> y2 >> z2;
if (x1 > x2) swap(x1, x2);
if (y1 > y2) swap(y1, y2);
if (z1 > z2) swap(z1, z2);
x1++, x2++, y1++, y2++, z1++, z2++;
x2 --, y2 --, z2 --;
a[i] = {x1, y1, z1, x2, y2, z2};
for (int p = x1; p <= x2; p ++)
for (int j = y1; j <= y2; j ++)
for (int k = z1; k <= z2; k ++)
b[p][j][k] = i;
}
for (int i = 1; i <= n; i ++)
{
set<int> st;
auto [x1, y1, z1, x2, y2, z2] = a[i];
int ans = 0;
// xoy
for (int j = x1; j <= x2; j ++)
for (int k = y1; k <= y2; k ++)
{
st.insert(b[j][k][z1-1]);
st.insert(b[j][k][z2+1]);
}
// yoz
for (int j = y1; j <= y2; j ++)
for (int k = z1; k <= z2; k ++)
{
st.insert(b[x1-1][j][k]);
st.insert(b[x2+1][j][k]);
}
// xoz
for (int j = x1; j <= x2; j ++)
for (int k = z1; k <= z2; k ++)
{
st.insert(b[j][y1-1][k]);
st.insert(b[j][y2+1][k]);
}
if (st.count(0)) st.erase(st.find(0));
cout << st.size() << endl;
}
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T = 1;
// cin >> T;
while (T --)
{
solv();
}
return 0;
}