开始我的思路是用开个longlong变量存扩展倍数,但是这样是有问题的。当前面出现许多个for循环超过1<<64-1时,longlong变量变成负数了,而实际上随着后续end的加入,倍数小下来是可以不爆栈的。
后续又试了暴力,TLE了。
只能拿出数论思想,把倍数理解为10^n,然后又因为pow精度问题WA了很多,以后要注意了pow的精度。
这里出现了161.000000000000028,19595735.999999966472387这样的数据,需要自行设精度范围判断。
const int N = 1e5 + 5;
int t;
const double mx = ((ll)1 << 32) - 1;
int cot = 0;
double q[N];
string op;
int main()//精度
{
ll n;
double x;
while (cin >> n)
{
int cot = 0;
double sum = 0;
double pre = 0;
int fg = 0;
while (n--)
{
cin >> op;
if (op == "for")
{
scanf("%lf", &x);
q[++cot] = x;
pre += log10(x);
}
else if (op == "end")
{
x = q[cot];
cot--;
pre -= log10(x);
}
else
{
double now = pow(10.0, pre);
if ( now> mx||now<0)fg = 1;
else
sum += now;
if (sum > mx||sum<0)fg = 1;
}
}
if (fg == 1||sum<0)puts("OVERFLOW!!!");
else {
double judge = ceil(sum);
if (judge == sum)cout << (ll)sum << endl;
else if (judge - sum > 0.5)cout << (ll)sum << endl;
else cout << (ll)sum+1 << endl;
}
}
return 0;
}