P1401 题解

· · 题解

被叉了。

交了 10 次硬是没有发现取最大值没有打绝对值,wssb。

因为是要判定两个区间中元素乘积的最大值,那么判定两区间上下界乘积的绝对值的最大值,即 \max(|x_ly_l|,|x_ly_u|,|x_uy_l|, |x_uy_u|) 是否大于 2^{31} - 1 即可。

为什么要取绝对值?举个例子,x_l=1,x_u=-2^{31},y_l=1,y_u=2^{30}\max(|x_ly_l|,|x_ly_u|,|x_uy_l|, |x_uy_u|)=2^{61},而 \max(x_ly_l,x_ly_u,x_uy_l, x_uy_u)=2^{30},如果没有取绝对值,此时输出 int,而正解应是 long long int

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll r = 2147483647;

ll xa, xb, ya, yb;

void judge(ll x) {
    if (x >= r) cout << "long long int";
    else cout << "int";
}

int main() {

    cin >> xa >> xb >> ya >> yb;
    judge(max({abs(xa * ya), abs(xa * yb), abs(xb * ya), abs(xb * yb)}));

    return 0;
}