[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;
}
posted @ 2023-11-17 20:48  FurippuWRY  阅读(20)  评论(0)    收藏  举报