题解:AT_pakencamp_2020_day1_d 立方体を壊せ!
题目大意
给定一个边长为 \(N\) 的立方体,顶点坐标范围为 \([0,N]^3\)。用平面 \(x+y+z=K\) 将立方体切割,求包含原点 \((0,0,0)\) 的那一部分体积的 \(6\) 倍。
解题思路
显然根据 \(K\) 的不同取值范围分类讨论。
\(K \geq 3N\)
平面 \(x+y+z=K\) 在立方体 \([0,N]^3\) 的"上方",整个立方体都包含在 \(x+y+z \leq K\) 的区域内,体积为 \(N^3\)。
\(K \leq N\)
此时包含原点的部分是一个四面体,顶点为 \((0,0,0)\) 和平面与坐标轴的交点 \((K,0,0)\)、\((0,K,0)\)、\((0,0,K)\)。
四面体体积公式为 \(V = \frac{1}{6} \times K^3\),所以答案为 \(K^3\)。
\(2N \leq K < 3N\)
同样使用容斥原理,通过补集转换得到公式:
总体积的 \(6\) 倍减去补集部分:\(6N^3 - (3N-K)^3\)。
\(N < K < 2N\)
使用容斥原理。我们计算总体积减去不满足条件的部分。
通过坐标变换和对称性,可以得到公式:\(K^3 - 3 \times (K-N)^3\)。
代码
一定要在最后输出换行!!!我为这个调了半小时!!!
# include <bits/stdc++.h>
using namespace std;
long long n , k;
int main()
{
cin >> n >> k;
if (k >= 3 * n) cout << n * n * n * 6;
else if (k <= n) cout << k * k * k;
else if (k >= 2 * n) cout << n * n * n * 6 - (3 * n - k) * (3 * n - k) * (3 * n - k);
else cout << k * k * k - 3 * (k - n) * (k - n) * (k - n);
cout << "\n";
return 0;
}

浙公网安备 33010602011771号