萌新刚学OI,日常脑抽,求助一道水题/kk
查看原帖
萌新刚学OI,日常脑抽,求助一道水题/kk
298549
SIXIANG32楼主2020/10/13 13:25
#include<iostream>
#include<stack>
#include<cmath>
#include<string>
#define INF 1000000000
#define ERROR return INF;
using namespace std;
string str[1001000];
long long N[1001000];
long long x,cnt=0,m;
struct My_stack{
	stack<long long>sta;
	long long SIZE()
	{
		return sta.size();
	}
	long long CLEAR()
	{
		while(!sta.empty())
			sta.pop();
	}
	long long GET(long long &x,long long &y)
	{
		if(sta.size()<2)return INF;
		else
		{
			long long t1=sta.top();x=t1,sta.pop();
			long long t2=sta.top();y=t2,sta.pop();
			return 725;
		}
	}
	long long TOP()
	{
		if(sta.empty())ERROR
		else return sta.top();
	}
	long long NUM(long long x)
	{
		if(abs(x)>INF)ERROR
		else sta.push(x);
	}
	long long POP()
	{
		if(!sta.empty())sta.pop();
		else ERROR
	}
	long long DUP()
	{
		long long t=sta.top();
		sta.push(t);
	}
	long long INV()
	{
		if(TOP()==INF)ERROR
		else if(abs(-TOP())>INF)ERROR
		else sta.push(-TOP());
	}
	long long SWP()
	{
		long long x,y;
		if(GET(x,y)==INF)ERROR
		else sta.push(y),sta.push(x);
	}
	long long ADD()
	{
		long long x,y;
		if(GET(x,y)==INF)ERROR
		else if(abs(x+y)>INF)ERROR
		else sta.push(x+y);
	}
	long long SUB()
	{
		long long x,y;
		if(GET(x,y)==INF)ERROR
		else if(abs(y-x)>INF)ERROR
		else sta.push(y-x);
	}
	long long MUL()
	{
		long long x,y;
		if(GET(x,y)==INF)ERROR
		else if(abs(x*y)>INF)ERROR
		else sta.push(x*y);
	}
	long long DIV()
	{
		long long x,y;
		if(GET(x,y)==INF)ERROR
		else if(x==0)ERROR
		else if(abs(y/x)>INF)ERROR
		else sta.push(y/x);
	}
	long long MOD()
	{
		long long x,y;
		if(GET(x,y)==INF)ERROR
		else if(x==0)ERROR
		else if(abs(y%x)>INF)ERROR
		else sta.push(y%x);
	}
}S;
long long work(long long x)
{
	S.CLEAR();
	S.NUM(x);
	for(int p=1;p<=cnt;p++)
	{
		if(str[p]=="NUM")if(S.NUM(N[p])==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
		else if(str[p]=="POP")if(S.POP()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
		else if(str[p]=="INV")if(S.INV()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
		else if(str[p]=="DUP")if(S.DUP()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
		else if(str[p]=="SWP")if(S.SWP()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
		else if(str[p]=="ADD")if(S.ADD()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
		else if(str[p]=="SUB")if(S.SUB()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
		else if(str[p]=="MUL")if(S.MUL()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
		else if(str[p]=="DIV")if(S.DIV()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
		else if(str[p]=="MOD")if(S.MOD()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
	}
	return 725;
}
int main()
{
	string s;
	while(cin>>s&&s!="END")
	{
		if(s=="NUM")cin>>x,N[++cnt]=x;
		else N[++cnt]=-INF;
		str[cnt]=s;
		if(s=="END")break;
	}
	cin>>m;
	for(int p=1;p<=m;p++)
	{
		cin>>x;
		if(abs(x)>INF)
		{
			cout<<"ERROR"<<endl;
			continue;
		}
		if(work(x)==INF)continue;
		else if(S.TOP()==INF||S.SIZE()!=1)cout<<"ERROR"<<endl;
		else cout<<S.TOP()<<endl;
	}
}

代码略长,不过思路个人认为还是很清晰的(大雾
布吉岛哪里错了,题解区提到的坑点全写了,好像是 ERROR 多了?/fad/fad/fad

求助

2020/10/13 13:25
加载中...