abc312e <暴力>

发布时间 2023-07-30 10:32:43作者: O2iginal

题目

E - Tangency of Cuboids

思路

意识到本题的数据规模可以暴力去做!

  • \(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;
}