6122. 农夫约翰的奶酪块-模拟,枚举

农夫约翰有一块立方体形状的奶酪,它位于三维坐标空间中,从 (0,0,0) 延伸至 (N,N,N)。

农夫约翰将对他的奶酪块执行一系列 Q 次更新操作。

对于每次更新操作,农夫约翰将从整数坐标 (x,y,z)(到 (x+1,y+1,z+1)( 处切割出一个 1×1×1的奶酪块,其中 0≤x,y,z<N。

输入保证在农夫约翰切割的位置上存在一个 1×1×1的奶酪块。

由于农夫约翰正在玩牛的世界,当下方的奶酪被切割后,重力不会导致上方的奶酪掉落。

在每次更新后,输出农夫约翰可以将一个 1×1×N的砖块插入奶酪块中的方案数,使得砖块的任何部分都不与剩余的奶酪重叠。

砖块的每个顶点在全部三个坐标轴上均必须具有整数坐标,范围为 [0,N]。

农夫约翰可以随意旋转砖块。

输入格式

输入的第一行包含 N 和 Q。

以下 Q 行包含 x,y 和 z,为要切割的位置的坐标。

输出格式

在每次更新操作后,输出一个整数,为所求的方案数。

数据范围

2≤N≤1000
1≤Q≤2×1055,
0≤x,y,z<N

输入样例:
2 5
0 0 0
1 1 1
0 1 0
1 0 0
1 1 0
输出样例:
0
0
1
2
5
样例解释

在前三次更新操作后,[0,1]×[0,2]×[0,1] 范围的 1×2×1砖块与剩余的奶酪不重叠,因此它贡献了答案。

fig_1_cheese_bronze_dec24.png

#include<iostream>
using namespace std;

int n, m; // 定义全局变量 n 和 m,分别表示矩阵的维度和操作次数
const int N = 1020; // 定义常量 N,用于数组大小,确保足够存储数据

// 定义三个二维数组 a, b, c,用于记录不同方向上的计数
int a[N][N], b[N][N], c[N][N];

int res = 0; // 定义全局变量 res,用于记录满足条件的结果数量

int main()
{
    cin >> n >> m; // 输入矩阵的维度 n 和操作次数 m

    while (m--) // 循环执行 m 次操作
    {
        int x, y, z; // 定义局部变量 x, y, z,表示输入的坐标
        cin >> x >> y >> z; // 输入当前操作的坐标 (x, y, z)

        // 在 a[x][y] 上增加计数,并检查是否达到 n
        if (++a[x][y] == n) res++; // 如果计数达到 n,则结果 res 增加 1

        // 在 b[x][z] 上增加计数,并检查是否达到 n
        if (++b[x][z] == n) res++; // 如果计数达到 n,则结果 res 增加 1

        // 在 c[y][z] 上增加计数,并检查是否达到 n
        if (++c[y][z] == n) res++; // 如果计数达到 n,则结果 res 增加 1

        cout << res << endl; // 输出当前的结果 res
    }

    return 0; // 程序结束
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值