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;
}
posted @ 2024-12-16 22:11  SigmaToT  阅读(41)  评论(0)    收藏  举报