1 条题解

  • 0
    @ 2026-4-23 23:41:39

    Idea

    主要思路:分类讨论。

    可以发现 a,b,ca,b,c 中出现 1111 时,长方体会退化成“矩形”;出现 2211 将会退化成“线段”;出现 3311 会退化成“点”,可以看出,长宽高出现 11 的情况十分特殊,所以考虑依此分类讨论。

    为方便处理,我们先假设 a,b,ca,b,c 满足 abca\ge b\ge c,细分后可以得出如下 1414 种情况:

    a,b,ca,b,c 的情况 kk 结果 备注
    a=b=c=1a=b=c=1 66 11
    ^ 其他 00
    b=c=1b=c=1 55 22 相当于“线段”的端点
    ^ 44 a2a-2 相当于“线段”的内部
    其他 00
    c=1c=1 44 相当于“矩形”的顶点
    ^ 33 2(a+b4)2(a+b-4) 相当于“矩形”的边
    22 (a2)(b2)(a-2)(b-2) 相当于“矩形”的内部
    其他 00
    其他 33 88 相当于长方体的顶点
    ^ 22 4(a+b+c6)4(a+b+c-6) 相当于长方体的棱
    11 2[(a2)(b2)+(a2)(c2)+(b2)(c2)]2[(a-2)(b-2)+(a-2)(c-2)+(b-2)(c-2)] 相当于长方体的表面
    00 (a2)(b2)(c2)(a-2)(b-2)(c-2) 相当于长方体的内部
    其他 00

    Code

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    
    signed main(){
    	int x[3], k;
    	cin >> x[0] >> x[1] >> x[2] >> k;
    	sort(x, x + 3, greater<int>());
    	
    	int a = x[0], b = x[1], c = x[2];
    	if(c == 1 && b == 1 && a == 1) cout << (k == 6 ? 1 : 0);
    	else if(c == 1 && b == 1){
    		switch(k){
    			case 5 : cout << 2; break;
    			case 4 : cout << a - 2; break;
    			default : cout << 0; break;
    		}
    	}
    	else if(c == 1){
    		switch(k){
    			case 4 : cout << 4; break;
    			case 3 : cout << (a + b - 4) * 2; break;
    			case 2 : cout << (a - 2) * (b - 2); break;
    			default : cout << 0; break;
    		}
    	}
    	else {
    		switch(k){
    			case 3 : cout << 8; break;
    			case 2 : cout << (a + b + c - 6) * 4; break;
    			case 1 : cout << ((a - 2) * (b - 2) + (b - 2) * (c - 2) + (c - 2) * (a - 2)) * 2; break;
    			case 0 : cout << (a - 2) * (b - 2) * (c - 2); break;
    			default : cout << 0;
    		}
    	}
    	return 0;
    } 
    
    • 1

    信息

    ID
    9650
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者