P9713 题解

· · 题解

按题意模拟。

设体积为 V,体积变化量为 \Delta V

对于三个方向,分别设一个变量 x=0,y=0,z=0,用来判断 k 所在的部分是否已被切除。

每切除一部分的蛋糕,就更新一次变量。若 op=1x\leftarrow \max(k,x),若 op=2y\leftarrow \max(k,y),若 op=3z\leftarrow \max(k,z)

对于不同的 op,用其对应的变量与 k 进行比较,若 k 更小,则代表 k 所在的部分已经被切除了,此时体积不会减少,直接输出 V 即可。

k 更大或者等于,则 \Delta V=(k - x) \times (b - y) \times (c - z),然后将 V-\Delta V 赋值给 V,为切除后剩余的体积,输出 V

#include <bits/stdc++.h>
#define int long long

using namespace std;

int a, b, c, m, op, k, v, x, y, z;

signed main() {
    cin >> a >> b >> c >> m;
    v = a * b * c; 
    for (int i = 0; i < m; ++i) {
        cin >> op >> k;
        if (op == 1) {
            if (k < x) {
                cout << v << '\n';
                continue;
            } 
            else{
                v -= (k - x) * (b - y) * (c - z);
                x = max (x, k);
            }

        }
        if (op == 2) {
            if (k < y) {
                cout << v << '\n';
                continue;
            } 
            else{
                v -= (k - y) * (a - x) * (c - z);
                y = max (y, k);
            }
        }
        if (op == 3) {
            if (k < z) {
                cout << v << '\n';
                continue;
            } 
            else{
                v -= (k - z) * (b - y) * (a - x);
                z = max (z, k);
            }
        }
        cout << v << '\n';
    }
    return 0;
}