[Luogu] P9713 题解
P9713 题解
按题意模拟。
设体积为 \(V\),体积变化量为 \(\Delta V\)。
对于三个方向,分别设一个变量 \(x=0,y=0,z=0\),用来判断 \(k\) 所在的部分是否已被切除。
每切除一部分的蛋糕,就更新一次变量。若 \(op=1\),\(x\leftarrow \max(k,x)\),若 \(op=2\),\(y\leftarrow \max(k,y)\),若 \(op=3\),\(z\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>
using namespace std;
typedef long long ll;
ll a, b, c, m, op, k;
ll v;
ll x = 0, y = 0, z = 0;
int main() {
cin >> a >> b >> c >> m;
v = a * b * c;
for (ll 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;
}

浙公网安备 33010602011771号