- 题意
- 给出
- for
- add x
- end
- 三种指令
- 任意合法搭配
- 一开始为0,计算最后结果
- 但是如果中间的数大于1ll<<32,那么就输出栈溢出
- 否则输出答案
- 给出
- 题解
- 显然多次循环时应该将 栈顶*x 加入栈顶
- end时便出栈一次
- 但是如何判断溢出?
- 我用了比较稳妥但是运行速度慢的方法检测
- 但是这样被hack了
- 实际上只要设置一个上限,每次取这个上限与当前值的最小值即可
- 代码
-
#include <bits/stdc++.h> #define forn(i, n) for(int i = 0; i < int(n); i++) using namespace std; const long long INF = 1ll << 32; int main(){ int n; cin >> n; stack<long long> cur; cur.push(1); long long res = 0; while(n--){ string t; cin >> t; if (t == "for"){ int x; cin >> x; cur.push(min(INF, cur.top() * x)); } else if (t == "end"){ cur.pop(); } else{ res += cur.top(); } } if (res >= INF) cout << "OVERFLOW!!!" << endl; else cout << res << endl; }
-