题解: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;
}
posted @ 2025-08-18 12:51  zhangyimin12345  阅读(13)  评论(0)    收藏  举报