洛谷 2186 小Z的栈函数
https://www.luogu.org/problem/show?pid=2186
题目描述
小Z最近发现了一个神奇的机器,这个机器的所有操作都是通过维护一个栈来完成的,它支持如下11个操作:
NUM X:栈顶放入X。
POP:抛弃栈顶元素。
INV:将栈顶元素取出,然后放入它的相反数。
DUP:再放入一个和栈顶元素相同的数。
SWP:交换栈顶的两个元素。
ADD:取出栈顶的两个元素,两元素相加,所得结果放入栈内。
SUB:取出栈顶的两个元素,第二个元素减去第一个元素,所得结果放入栈内。
MUL:取出栈顶的两个元素,两元素相乘,所得结果放入栈内。
DIV:取出栈顶的两个元素,第二个元素整除以第一个元素,所得结果放入栈内。
MOD:取出栈顶的两个元素,第二个元素取模以第一个元素,所得结果放入栈内。
END:结束这个程序。
然后,小Z用上面的11种操作写了一个一元函数f(x)。x就是放入栈里面第一个初始元素。然后经过这个函数的一系列操作,当函数结束的时候,正常情况下,栈里面会有唯一的一个元素。剩下的这个元素就作为函数f(x)的返回值。
小Z有N个询问,询问每个值x经过上述函数所映射出的f(x)是多少。但是这个由于机器太老了,跑起东西来太慢了,小Z又是一个急性子,所以请你们写一个程序,来帮助小Z计算他查询的f(x)。
输入输出格式
输入格式:
输入若干行,仅包含上述11个操作,用来描述函数f(x)的操作,函数的结束保证以END结尾;
接下来一个整数N;
下面N行每行一个数字ai,代表栈里面的初始元素。
输入数据不保证合法!!!
输出格式:
如果最后栈内不是一个元素,输出“ERROR”;
还有,由于这台机器太破了,所以如果运算过程中有数字的绝对值大于1000000000机器也输出“ERROR”;
如果输入数据不合法,导致中途退出,输出“ERROR”;
否则输出对应的f(x)。
输入输出样例
说明
【提示】
仔细考虑不合法的情况,避免不必要的RE和WA。
【数据规模】
函数操作步数<=2000
询问数<=2000
非常水的模拟
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 2011 #define inf 1000000000 typedef long long LL; char s[N][5]; int num[N]; int t; int st[N],top; void read(int &x) { x=0; int f=1; char c=getchar(); while(!isdigit(c)) { if(c=='-') f=-1; c=getchar(); } while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } x*=f; } void work(int x) { st[top=1]=x; for(int i=1;i<t;i++) { if(s[i][0]=='N') { if(num[i]>inf) { printf("ERROR\n"); return; } st[++top]=num[i]; } else if(s[i][0]=='P') { if(!top) { printf("ERROR\n"); return; } top--; } else if(s[i][0]=='I') { if(!top) { printf("ERROR\n"); return; } st[top]=-st[top]; } else if(s[i][0]=='D' && s[i][1]=='U') { if(!top) { printf("ERROR\n"); return; } st[++top]=st[top-1]; } else if(s[i][0]=='S' && s[i][1]=='W') { if(top<2) { printf("ERROR\n"); return; } swap(st[top],st[top-1]); } else if(s[i][0]=='A') { if(top<2 || abs(st[top]+st[top-1])>inf) { printf("ERROR\n"); return; } st[--top]+=st[top+1]; } else if(s[i][0]=='S') { if(top<2 || abs(st[top-1]-st[top]>inf)) { printf("ERROR\n"); return; } st[--top]-=st[top+1]; } else if(s[i][0]=='M' && s[i][1]=='U') { if(top<2 || abs(1ll*st[top-1]*st[top]>inf)) { printf("ERROR\n"); return; } st[--top]*=st[top+1]; } else if(s[i][0]=='D') { if(top<2 || !st[top]) { printf("ERROR\n"); return; } st[--top]/=st[top+1]; } else if(s[i][0]=='M') { if(top<2 || !st[top]) { printf("ERROR\n"); return; } st[--top]%=st[top+1]; } } if(top>1) printf("ERROR\n"); else printf("%d\n",st[top]); return; } int main() { while(1) { scanf("%s",s[++t]); if(s[t][0]=='E') break; if(s[t][0]=='N') scanf("%d",&num[t]); } int n,x; read(n); while(n--) read(x),work(x); }