题解:P15131 [ROIR 2026] 长方体的染色
思路:分类讨论
从有多少不为
- 全为
1 ,则六面上色的正方体有1 个,其余为0 ; - 两边为
1 ,立方体呈条状,设长度为k ,则五、四面上色的正方体分别有2 、k - 2 个,其余为0 ; - 一边为
1 ,立方体呈面状,设另外两边长为x,y ,则四、三、二面上色的正方体分别有4 、2(x - 2) + 2(y - 2) 、(x - 2)(y - 2) 个,其余为0 ; - 全不为
1 ,立方体呈块状,设三边长为a,b,c ,则三、二、一、零面上色的正方体分别有8 、4[(a - 2) + (b - 2) + (c - 2)] 、2[(a - 2)(b - 2) + (b - 2)(c - 2) + (c - 2)(a - 2)] 、(a - 2)(b - 2)(c - 2) 个,其余为0 ; ::::success[code]#include <bits/stdc++.h> #define int long long using namespace std; int a, b, c, k, res = 0; int f(int x){ return max(0ll, x); } //防止出现负数问题 int check(){ return (a > 1) + (b > 1) + (c > 1); } //多少条边不为1 int S(int a, int b){ return f(a) * f(b); } //a * b * 1的块数 int V(int a, int b, int c){ return f(a) * f(b) * f(c); } //a * b * c的块数 signed main(){ scanf("%lld%lld%lld%lld", &a, &b, &c, &k); if (a > b) swap(a, b); if (b > c) swap(b, c); if (a > b) swap(a, b); //使得a ≤ b ≤ c if (!check()) puts(k == 6 ? "1" : "0"); else if (check() == 3){ if (!k) printf("%lld\n", V(a - 2, b - 2, c - 2)); else if (k == 1) printf("%lld\n", 2 * (S(a - 2, b - 2) + S(b - 2, c - 2) + S(c - 2, a - 2))); else if (k == 2) printf("%lld\n", 4 * (f(a - 2) + f(b - 2) + f(c - 2))); else if (k == 3) puts("8"); else puts("0"); } else if (check() == 2){ if (k == 2) printf("%lld\n", S(b - 2, c - 2)); else if (k == 3) printf("%lld\n", 2 * (f(b - 2) + f(c - 2))); else if (k == 4) puts("4"); else puts("0"); } else { if (k == 4) printf("%lld\n", f(c - 2)); else if (k == 5) puts("2"); else puts("0"); } return 0; }::::