题目背景
某地ENLIGHTENED
的XM
研究所正在研究Portal
的处理法则,想要揭示XM能量
的来源以及应用XM能量
。ENLIGHTENED
的首席科学家Jacks
发现其能量的运算法则以及运算方法,但是方法十分复杂,仅靠人手工计算是很难算出答案的,所以它需要你协助他完成计算。
题目描述
Portal
计算XM能量
是通过个22个栈(00号栈,11号栈)实现的,它把对XM
能量的操作如下
PUSHPUSH XX NUMNUM
把NUMNUM加入到X号栈的栈顶。
POPPOP XX
把XX号栈的栈顶元素删除。
ADDADD XX
取出00号栈和11号栈的元素各一个,并且把它的和放入XX号栈。
SUBSUB XX
取出00号栈和11号栈的元素各一个,并且把它的差的绝对值放入XX号栈。
DELDEL XX
清空XX号栈中所有元素不管栈是否为空。
MOVEMOVE XX YY
循环操直到YY号栈为空,把YY号栈的栈顶元素加入到XX号栈,删除YY号栈的栈顶元素。
数据保证X和Y不相同
SWAPSWAP
将两个栈的所有元素调换。
ENDEND
代表命令结束,并且分两行分别输出0号栈和1号栈由栈顶到栈底的元素的值,若栈内无元素,输出NONE
。数据保证指令以END
结束且仅有一个END
,并且也需要输出SUCCESS
。
AKNOIAKNOI
等为无效操作,无效操作后不接数字。
更正不会有类似无效操作
对于每一行指令,若当前指令成功执行输出SUCCESS
,若取出或删除元素时栈内为空或者没有对应指令输出UNSUCCESS
并且不执行该行指令。
输入输出格式
输入格式:
输入若干行指令,以END
指令结束
输出格式:
对于每一次操作,都要对应输出SUCCESS
或者UNSUCCESS
,对于END
根据指令描述输出栈内元素。
输入输出样例
输入样例#1: 复制
PUSH 0 10 PUSH 0 20 PUSH 0 30 PUSH 0 40 PUSH 1 50 PUSH 1 60 ADD 0 ADD 0 ADD 0 END
输出样例#1: 复制
SUCCESS SUCCESS SUCCESS SUCCESS SUCCESS SUCCESS SUCCESS SUCCESS UNSUCCESS SUCCESS 150 30 20 10 NONE
输入样例#2: 复制
PUSH 0 10 PUSH 0 20 PUSH 0 30 PUSH 0 40 PUSH 1 50 PUSH 1 60 MOVE 0 1 END
输出样例#2: 复制
SUCCESS SUCCESS SUCCESS SUCCESS SUCCESS SUCCESS SUCCESS SUCCESS 50 60 40 30 20 10 NONE
说明
对于20\%20%的数据 数据保证不会出现MOVE/SWAP
操作,$命令总数 \leq 100$
对于40\%40%的数据 $命令总数 \leq 1000$
对于60\%60%的数据 数据保证MOVE/SWAP
的操作次数不会超过1000010000次,$命令总数 \leq 10^5$
对于100\%100%的数据 $0 \leq X,Y \leq 1,命令总数 \leq 10^6$
数据保证无论任何情况,栈中元素的值XX满足$0 \leq x \leq 2^{63}-1$
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000006;
string s;
int h[2],pre[MAXN],nxt[MAXN],tot=2;
long long w[MAXN];
inline void add(int u,int v)
{
nxt[u]=v;
pre[v]=u;
}
inline long long pop(int x)
{
add(pre[x],nxt[x]);
return w[x];
}
inline void push(int x,long long num)
{
w[++tot]=num;
if(x==0){
add(pre[2],tot);
add(tot,2);
}
else{
add(tot,nxt[2]);
add(2,tot);
}
}
int main()
{
ios::sync_with_stdio(false);
int i,j,x,y,pos;
long long num;
h[0]=0;h[1]=1;
add(0,2);
add(2,1);
cin>>s;
while(s!="END"){
if(s=="PUSH"){
cout<<"SUCCESS"<<endl;
cin>>x>>num;
x=h[x];
push(x,num);
}
else if(s=="POP"){
cin>>x;
x=h[x];
if(x==0){
if(pre[2]==0) cout<<"UNSUCCESS"<<endl;
else{
pop(pre[2]);
cout<<"SUCCESS"<<endl;
}
}
else{
if(nxt[2]==1) cout<<"UNSUCCESS"<<endl;
else{
pop(nxt[2]);
cout<<"SUCCESS"<<endl;
}
}
}
else if(s=="ADD"){
cin>>x;
x=h[x];
if(pre[2]==0||nxt[2]==1) cout<<"UNSUCCESS"<<endl;
else{
cout<<"SUCCESS"<<endl;
push(x,pop(pre[2])+pop(nxt[2]));
}
}
else if(s=="SUB"){
cin>>x;
x=h[x];
if(pre[2]==0||nxt[2]==1) cout<<"UNSUCCESS"<<endl;
else{
cout<<"SUCCESS"<<endl;
push(x,abs(pop(pre[2])-pop(nxt[2])));
}
}
else if(s=="DEL"){
cout<<"SUCCESS"<<endl;
cin>>x;
x=h[x];
if(x==0) add(0,2);
else add(2,1);
}
else if(s=="MOVE"){
cout<<"SUCCESS"<<endl;
cin>>x>>y;
x=h[x];y=h[y];
add(pre[2],nxt[2]);
if(x==0){
add(pre[1],2);
add(2,1);
}
else{
add(2,nxt[0]);
add(0,2);
}
}
else if(s=="SWAP"){
cout<<"SUCCESS"<<endl;
swap(h[0],h[1]);
}
cin>>s;
}
cout<<"SUCCESS"<<endl;
if(h[0]==0){
pos=pre[2];
if(pos==0) cout<<"NONE"<<endl;
else{
while(pos!=0){
cout<<w[pos]<<" ";
pos=pre[pos];
}
cout<<endl;
}
pos=nxt[2];
if(pos==1) cout<<"NONE"<<endl;
else{
while(pos!=1){
cout<<w[pos]<<" ";
pos=nxt[pos];
}
cout<<endl;
}
}
else{
pos=nxt[2];
if(pos==1) cout<<"NONE"<<endl;
else{
while(pos!=1){
cout<<w[pos]<<" ";
pos=nxt[pos];
}
cout<<endl;
}
pos=pre[2];
if(pos==0) cout<<"NONE"<<endl;
else{
while(pos!=0){
cout<<w[pos]<<" ";
pos=pre[pos];
}
cout<<endl;
}
}
return 0;
}