主页
搜索
最近更新
数据统计
申请密钥
批量保存
开发版网站(新前端)
系统公告
1
/
1
请查看完所有公告
题解:AT_pakencamp_2020_day1_d 立方体を壊せ!
最后更新于 2025-08-27 21:05:05
作者
zhangyimin12345
分类
题解
题解
AT_pakencamp_2020_day1_d
复制 Markdown
查看原文
转到新前端
删除文章
更新内容
## 题目大意 给定一个边长为 $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$。 ## 代码 一定要在最后输出换行!!!我为这个调了半小时!!! ```cpp # 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; } ```
正在渲染内容...
点赞
0
收藏
0