USACO2024DEC铜组T2
USACO2024铜组T2
注意到:
FJ 可以随意旋转砖块。
于是,我们可以从不同的角度,即 \(x\) 方向、\(y\) 方向、\(z\) 方向三个方向来统计答案,以此做到不重不漏
然后,我们注意到,如果有位置能够放下砖块:
对于砖块 \((1,1,n)\),只要有 \(n\) 个被消除的位置它们的 \(x,y\) 都相等,那么在 \((x,y,1)\) ~ \((x,y,n)\) 的位置,就可以放下一个 \((1,1,n)\) 的砖块;
对于砖块 \((1,n,1)\),只要有 \(n\) 个被消除的位置它们的 \(x,z\) 都相等,那么在 \((x,1,z)\) ~ \((x,n,z)\) 的位置,就可以放下一个 \((1,1,n)\) 的砖块;
对于砖块 \((n,1,1)\),只要有 \(n\) 个被消除的位置它们的 \(y,z\) 都相等,那么在 \((1,y,z)\) ~ \((n,y,z)\) 的位置,就可以放下一个 \((n,1,1)\) 的砖块。
而且观察到:
由于 FJ 正在玩牛的世界,当下方的奶酪被切割后,重力不会导致上方的奶酪掉落。
所以每一次更新,消除一个单位体积的奶酪,都只会影响其在 \(x\) 方向、\(y\) 方向、\(z\) 方向的方案数,对其它的位置并没有影响,而且每一次更新,方案数相较以前的方案数最多会 \(+3\)(并且每一次能够插入砖块的方案数所组成的序列,是单调不降的)
于是,我们搞一个 \(cnt\),每次统计完答案直接加到 \(cnt\) 中就行,然后输出 \(cnt\);
然后,我们可以开三个二维数组,表示当前 \((x,y,1)\) ~ \((x,y,n)\) 或者 \((x,1,z)\) ~ \((x, n, z)\) 或者 \((1,y,z)\) ~ \((n,y,z)\) 的位置能否插入一个砖块,并且每次消除奶酪的时候,三个数组中表示当前二维位置的元素都 \(+1\);对于每个数组,如果当前二维位置统计到了 \(n\) 个,那么 \(cnt\) 加一
点击查看代码
#include <iostream>
#include <cmath>
#include <vector>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
const int maxn = 1e3 + 10;
int x[maxn][maxn];
int y[maxn][maxn];
int z[maxn][maxn];
int main()
{
int n, q;
cin >> n >> q;
long long cnt = 0;
while (q--)
{
int a, b, c;
cin >> a >> b >> c;
x[b][c]++;
y[a][c]++;
z[a][b]++;
if (x[b][c] == n)
++cnt;
if (y[a][c] == n)
++cnt;
if (z[a][b] == n)
++cnt;
cout << cnt << '\n';
}
return 0;
}

浙公网安备 33010602011771号