• 题意
    • 给出
      • 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;
      }

发表评论

邮箱地址不会被公开。 必填项已用*标注